如何使用 ng-repeat 使 bxSlider 在 AngularJS 中工作?

Posted

技术标签:

【中文标题】如何使用 ng-repeat 使 bxSlider 在 AngularJS 中工作?【英文标题】:How to make bxSlider work in AngularJS with ng-repeat? 【发布时间】:2019-09-07 00:01:18 【问题描述】:

我正在尝试更新从 SQLServer 数据库获取图像和标题的现有动态网页,该数据库加载到 AngularJS ng-repeat 中。 bxSlider 可以很好地处理静态数据,但是当涉及到使用 ng-repeat 从 Web 服务获取的数据时,它会显示为图像列表。

我尝试在页眉、页脚和 bxSlider div 之后使用以下脚本。但它不起作用。

$(window).load(function () 
    $(function () 
        $('.bxslider').load(function () 
            $('.bxslider').bxSlider(
                speed: 500,
                auto: true,
                captions: true,
                slideWidth: 800
            );
        );
    );
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.5.0/angular.min.js"></script>
<link href="https://cdnjs.cloudflare.com/ajax/libs/bxslider/4.2.15/jquery.bxslider.min.css" rel="stylesheet" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/bxslider/4.2.15/jquery.bxslider.min.js"></script>
<!-----bxSlider html Code----------------->
<div class="bxslider" ng-controller="appCtrl">
    <div ng-repeat="tops in topStories">
       <a ng-href="article.html?url=tops.articleURL">
        <img ng-src="tops.imageURL" title="tops.title">
       </a>
     </div>
</div>

加载数据后,bxSlider 未应用于控制器。 我怎样才能解决这个问题以获得完美的滑块? https://bxslider.com/examples/image-slideshow-captions/

【问题讨论】:

这是一个 plunker(不是我的),它演示了如何为 bxSlider 创建自定义指令:embed.plnkr.co/wrk9cU @Pop-A-Stash 感谢您的重播。但是指令可以很好地处理硬编码的 JSON 数据,如您的演示中所示。当谈到从 asp.net web 服务中获取数据时,问题仍然存在。有没有我遗漏的方法? 我修改了前面的示例以观察slideit 属性,以便在获取新的一天时正确创建和销毁滑块:next.plnkr.co/edit/UBaGrfDAfrVa6eJN 【参考方案1】:

在此处查看此示例:http://next.plnkr.co/edit/UBaGrfDAfrVa6eJN 数据被移动到异步服务以模拟 Web 服务调用。我打了两个电话,相隔 5 秒来模拟新数据。一定要在作用域被销毁时清理滑块对象。

关键部分是这个链接功能。 scope.$watch slideit 属性进行更改,并使用 $timeout() 强制执行摘要循环。

link: function(scope, elm, attrs) 
  var slider;
  scope.$watch('slideit', function() 
    if(slider) 
      slider.destroySlider();
    
    scope.bestDeals = scope.slideit;
    if (scope.bestDeals && scope.bestDeals.length > 0) 
      $timeout(function() 
        slider = elm.bxSlider(
          captions: true,
          auto: true,
          autoControls: true,
          slideWidth: 110,
          minSlides: 1,
          maxSlides: 6,
          moveSlides: 1,
          slideMargin: 10,
          pager: false,
          autoHover: true,
        );
      );
    
  );

  scope.$on('destroy', function() 
    if (slider) 
      slider.destroySlider();
    
  );
,

【讨论】:

以上是关于如何使用 ng-repeat 使 bxSlider 在 AngularJS 中工作?的主要内容,如果未能解决你的问题,请参考以下文章

Jquery Mobile 使 Image Slider bxSlider 出现问题

如何在 ng-repeat 中使字段显示为没有 HTML 代码的文本

如何在 ng-repeat 元素后添加空格?

Angular - 无法使 ng-repeat orderBy 工作

如何根据“ng-repeat”计数分配“ng-style”指令值

如何使此滑块自动滑动?