带有Angular JS的光滑轮播

Kal*_*tel 15 jquery carousel angularjs slick.js

我在我的一个AngularJS应用程序中使用Slick轮播.为此,我创建了如下指令:

  myApp.directive('slickSlider',function(){
   return {
     restrict: 'A',
     link: function(scope,element,attrs) {
       $(element).slick(scope.$eval(attrs.slickSlider));
   }
  }
 }); 
Run Code Online (Sandbox Code Playgroud)

这是我在视图文件中的代码:

  <div class="clearfix"  
  slick-slider="{dots: false, arrows: true, draggable: 
  false, slidesToShow:3, infinite:false}">
              <div class="my-slide">
                  <a><img ng-src="assets/img/img1.png"/></a>
              </div>
              <div class="my-slide">
                  <a><img ng-src="assets/img/img1.png"/></a>
              </div>
              <div class="my-slide">
                  <a><img ng-src="assets/img/img1.png"/></a>
              </div>
              <div class="my-slide">
                  <a><img ng-src="assets/img/img1.png"/></a>
              </div>
              <div class="my-slide">
                  <a><img ng-src="assets/img/img1.png"/></a>
              </div>
              <div class="my-slide">
                  <a><img ng-src="assets/img/img1.png"/></a>
              </div>
    </div>
Run Code Online (Sandbox Code Playgroud)

在这种情况下,它工作正常并正确初始化.

但是当我使用ngRepeat动态创建幻灯片时,它没有初始化并一个接一个地显示幻灯片.

这是我使用ngRepeat的代码

<div class="clearfix"  
  slick-slider="{dots: false, arrows: true, draggable: 
  false, slidesToShow:3, infinite:false}">
      <div class="my-slide" ng-repeat="slide in slides">
         <a><img ng-src="assets/img/{{slide.img}}"/></a>
       </div>
 </div>
Run Code Online (Sandbox Code Playgroud)

有任何建议,我该如何解决?

pix*_*its 20

我怀疑光滑的插件可能需要DOM完全渲染才能正常工作.

尝试:

myApp.directive('slickSlider',function($timeout){
 return {
   restrict: 'A',
   link: function(scope,element,attrs) {
     $timeout(function() {
         $(element).slick(scope.$eval(attrs.slickSlider));
     });
   }
 }
}); 
Run Code Online (Sandbox Code Playgroud)

  • 如果你查看$ timeout的源代码,它会调用下面的$ browser.defer.延迟方法将在执行DOM之前将执行排队.不幸的是,这个事实没有记录得太好.你可以从Angular团队找到一个有趣的讨论:https://github.com/angular/angular.js/issues/734.. (4认同)

luk*_*kea 11

$ timeout仍然没有为数据提供足够的时间来初始化我的场景所以我更多地修改了指令以观察数据是否有内容(这也可能会在数据发生变化时产生重新绑定的效果,而不仅仅是如果你改变了isInitialized的使用,DOM初始化onLoad:

app.directive('slickSlider', function () {
    return {
        restrict: 'A',
        scope: {'data': '='},
        link: function (scope, element, attrs) {
            var isInitialized = false;
            scope.$watch('data', function(newVal, oldVal) {
                if (newVal.length > 0 && !isInitialized) {
                    $(element).slick(scope.$eval(attrs.slickSlider));
                    isInitialized = true;
                }
            });
        }
    }
});
Run Code Online (Sandbox Code Playgroud)

这样,angularJS监视要加载的数据,并且只在数据有长度时才挂起光滑.

(btw $ watch是必要的,而不是$ observe,因为"data"属性不使用插值("{{...}}")​​:如果你想获得低位,请看看这个好的答案对此.)

用法:

<div class="clearfix" data="slides" 
    slick-slider="{dots: false,
                   arrows: true,
                   draggable: false,
                   slidesToShow:3,
                   infinite:false}">
    <div class="my-slide" ng-repeat="slide in slides">
        <a><img ng-src="assets/img/{{slide.img}}"/></a>
    </div>
</div>
Run Code Online (Sandbox Code Playgroud)

感谢 这个答案和我从这个问题得到的这个github