【问题标题】:Slick Carousel with Angular JS带有 Angular JS 的光滑轮播
【发布时间】:2014-08-22 18:53:00
【问题描述】:

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

  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>

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

【问题讨论】:

  • 注意有一个 AnguarJS 插件 ui-carousel 可以在没有 jQuery 的情况下执行流畅的轮播。

标签: jquery angularjs carousel slick.js


【解决方案1】:

我怀疑 slick 插件可能需要完全渲染 DOM 才能正常工作。

试试:

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

【讨论】:

  • 只是想确认一下,如果我们在$timeout函数中不指定延迟参数,是不是保证DOM加载完成后才会执行?
  • 是的,函数的执行被推迟到渲染阶段之后。
  • 如果你查看 $timeout 的源代码,它会在下面调用 $browser.defer。 defer 方法将排队执行,直到渲染 DOM 之后。不幸的是,这个事实并没有很好地记录下来。你可以从 Angular 团队找到一个有趣的讨论:github.com/angular/angular.js/issues/734。 .
  • 感谢分享。 :)
  • 好友.. 采取角度实现... github.com/vasyabigi/angular-slick
【解决方案2】:

$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 监视要加载的数据,并且仅在数据有长度时才挂起。

(顺便说一句,$watch 是必需的,而不是 $observe,因为“数据”属性不使用插值(“{{...}}”)​​:如果你想获得低调一点。)

用法:

<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 answerthis github 我从this so question 获得的

【讨论】:

  • 这工作正常,但它会抛出一个错误,说“newVal 未定义。知道为什么吗?
  • @mshahbazm 这是一个很老的答案,我最终没有使用它,但我只能猜测您在声明范围时有错字。$watch 函数或数据不是正确连接。新值参数肯定是“newVal”吗?您是否在 html 声明中添加了有效的“数据”?
  • 感谢您的回复,我将它包裹在一个条件“if (newVal)”中,它对我来说效果很好。
猜你喜欢
  • 2017-10-11
  • 1970-01-01
  • 2015-08-11
  • 2016-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多