带有Angular JS的光滑轮播

时间:2014-07-02 05:18:03

标签: jquery angularjs carousel slick.js

我在Slick申请中使用AngularJS轮播。为此,我创建了如下指令:

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

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

  <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>

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

但是当我使用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>

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

2 个答案:

答案 0 :(得分:20)

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

尝试:

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

答案 1 :(得分:11)

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

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;
                }
            });
        }
    }
});

这样,angularJS会监视要加载的数据,只有当数据有长度时才会挂起光滑。

(btw $ watch是必要的,而不是$ observe,因为“data”属性不使用插值(“{{...}}”)​​:如果你想要查看this great answer得到这个低点。)

用法:

<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>

感谢我从this so answer

获得的this githubthis so question