【问题标题】:Loader while directive is loading加载指令时加载程序
【发布时间】:2016-07-29 16:08:46
【问题描述】:

我正在使用 Angular 和 Angular Material 做一个网络应用程序。我必须做一个轮播,我发现了一个不错的 jquery 组件。所以我做了一个指令。它可以工作,但问题是在 1 或 2 秒内,我看到轮播的元素像 <ul> 列表一样垂直显示。然后,在构建指令时,我正确地看到了轮播。
有没有办法插入在指令未构建时显示的加载程序(可能带有角度材料)?

这是代码

angular.module('app').directive("slick", function($timeout) {
        return function(scope: any, el: any, attrs: any) {
            $timeout((function() {
                el.slick({
                    arrows: true,
                    autoplay: false,
                    dots: true,
                    infinite: false,
                    speed: 300,
                    slidesToShow: 4,
                    slidesToScroll: 4,
                    responsive: [
                        {
                        breakpoint: 1024,
                        settings: {
                            slidesToShow: 3,
                            slidesToScroll: 3,
                            infinite: true,
                            dots: true
                        }
                        },
                        {
                        breakpoint: 600,
                        settings: {
                            slidesToShow: 2,
                            slidesToScroll: 2
                        }
                        },
                        {
                        breakpoint: 480,
                        settings: {
                            slidesToShow: 1,
                            slidesToScroll: 1
                        }
                        }
                        // You can unslick at a given breakpoint now by adding:
                        // settings: "unslick"
                        // instead of a settings object
                    ]
                })
            }), 100)
        }
    });

【问题讨论】:

  • 这并不能回答问题,但将 jQuery 与 AngularJS(和 Angular 材料)混合并不是一个好习惯 - stackoverflow.com/a/30007955/782358
  • @camden_kid 我不认为这总是正确的。他将整个事情包装在指令中,这是 正确 以角度做事的方式。即使是您发布的 SO 答案,在第 2 点也是如此。
  • @CozyAzure 是的,没错。将它包装在指令中是最好的方法,但我仍然认为将两者混合不是一个好主意。不过,需求是必须的。

标签: javascript jquery angularjs angularjs-directive angular-material


【解决方案1】:

我会使用一个布尔范围变量来跟踪 slick 的初始化时间。从 false 开始,并使用 slick 的 init 事件知道何时设置为 true。

基本上:

angular.module('app').directive("slick", function($timeout) {
    return {
        restrict: 'E',
        replace: true,
        scope: true,
        templateUrl: 'slick.tpl.html',
        link: function(scope: any, el: any, attrs: any) {
            scope.slickReady = false;

            // use a child element (defined in template) so we can toggle between carousel and spinner
            var slickEl = el.children('.slick').first();
            if(slickEl){
                // listen for slick's init event 
                slickEl.on('init', function(){
                    scope.slickReady = true;
                });

                // initialize slick (not sure why you had it wrapped in $timeout in OP)
                slickEl.slick({
                    ...
                });
            }
        };
    }
});

slick.tpl.html

<div ng-switch on="slickReady">
    <div class="slick" ng-switch-when="true"></div>
    <div class="spinner" ng-switch-when="false">
        <!-- use whatever kind of spinner you want -->
    </div>
</div>

【讨论】:

  • 感谢您的回答,抱歉迟到了!我尝试使用您的代码,但出现错误:TypeError: el.querySelector is not a function
  • 我找到了解决该错误的方法,但它还不起作用。这是 slick.tpl:

    {{item.who}}

    我已经在 js 上编辑了这个: var slickEl = el[0].querySelector('.slick');因为,调试它,'el'是如此结构化:0:div长度:1
  • 我已经解决了这个错误:$document.hasClass(".slick");但光滑并没有建立......
  • 我的错... el 是一个 angular.element,但 element.querySelector 是一个核心 DOM 方法。由于我们知道您正在加载 jQuery,因此最好使用 el.children('.slick').first()(我已通过此更改更新了答案)
猜你喜欢
  • 1970-01-01
  • 2016-06-13
  • 2015-10-12
  • 1970-01-01
  • 1970-01-01
  • 2011-01-05
  • 1970-01-01
  • 1970-01-01
  • 2018-12-31
相关资源
最近更新 更多