【问题标题】:AngularJS ngRepeat and jQuery - DOM rebuilding issuesAngularJS ngRepeat 和 jQuery - DOM 重建问题
【发布时间】:2014-10-31 02:19:23
【问题描述】:

我非常清楚混合 angularjs 和 jquery 不是一个好主意。 但是,我需要一个自定义轮播,它只能通过 TEXT 滑动。 angularjs 的所有现有轮播动画都严重依赖图像作为内容的一部分,而我没有图像。 所以我为这种东西找到了一个非常好的 jquery 库,叫做“slick”。

它适用于 angularjs,但是当我将新值动态添加到现有数组时,整个事情就崩溃了。 如何更改这部分代码,以便我可以动态地将对象添加到数组并保持 jquery slick 库正常工作?

这是代码,您可以按“上一个”和“下一个”,轮播将起作用,但只要您按“添加新元素”按钮,整个事情就会崩溃。 http://jsbin.com/tihodihuho/1/edit?html,js,output

【问题讨论】:

  • 使用指令来绑定 slick 和 unslick 是个好主意。
  • Senthil 我对使用指令解决这个问题非常感兴趣,但是我缺乏适当的知识。你有一个例子吗?谢谢你。我当前的代码:jsbin.com/yocun/1/edit?html,js,console,output
  • 我绝对可以帮助你,现在有事。我会尽快添加答案。

标签: jquery angularjs jquery-plugins ng-repeat


【解决方案1】:

您需要确保在调用 jQuery 函数 unslick 和 slick 时,DOM 已经被渲染。

您可以通过将这些函数放在 $timeout 函数中来实现这一点(当然,延迟为 0)。这将确保$timeout 函数内的代码将在$diggest 循环结束后执行。

试试这个:

Example

controller('myCtrl', ['$timeout',function($timeout){ 
  var self = this;  
  self.data = [{
        id: 1,
        title: 'A title, representing part 1',
        text: 'This is my TEXT 1'
      },
      {
        id: 2,
        title: 'Anoter interesting title that will grab your attention',
        text:'...and even longer text!'
      }];

  self.next =function() {
    $('.your-class').slickNext();
  };

  self.prev =function() {
    $('.your-class').slickPrev();
  };

  self.add = function() {
    var newID = self.data.length + 1;
    self.data.push({
      id:newID,
      title:'A totally new object!',
      text:'Dynamically added object to an existing array.'
    });   
    $timeout(function(){      
      $('.your-class').unslick();
       $('.your-class').slick({
        autoplay: false,
        autoplaySpeed: 1500,
        swipeToSlide: true
      });            
    });
  };
}]);

更新日期

为了解决 OP 在下面的 cmets 中描述的问题,并且它与原始问题完全无关,我想出了这个解决方法:

$timeout(function(){            
  $('.your-class').unslick();

  //You would think that `unslick` would take care of this, but it didn't so: 
  $('.your-class .slick-cloned, .your-class .slick-list.draggable').remove();

  //this is a workaround, which proves that the issue was with the plugin
  //nothing to do with the original question. In order to address this properly the
  //OP should open a new question or a bug in the `unslick` plugin.

   $('.your-class').slick({
    autoplay: false,
    autoplaySpeed: 1500,
    swipeToSlide: true
  });            
});

Example

【讨论】:

  • 虽然这确实解决了问题,但它会创建一个新问题。由于未知的原因,每次我向数组添加新对象时,都会在 slick 中创建另一个空 div。但是,数组的大小是正确的。例如,数组中有 2 个对象,而 slick 在轮播中有两个 div。然后我添加了另一个对象,数组中有 3 个对象,但是 slick 向其轮播添加了两个 div(一个为空)。例如:jsbin.com/yocun/1/edit?html,js,console,output
  • @uglycode 欢迎来到 stackoverflow!由于此答案解决了原始问题,因此您应该将其标记为已接受。您遇到的问题是由slick 插件产生的,这是一个完全不同的问题。因此,您应该为该问题打开一个新问题。这就是 stackoverflow 的工作原理,因此请将此答案标记为已接受,打开一个新问题,我很乐意为您提供帮助。谢谢!
  • @uglycode 看看我的最新更新。但是,请注意,这不是 SO 的工作方式。请将此答案标记为已接受,谢谢!
  • 感谢您对 SO 规则的解释以及您建议的解决方案!如果我理解正确:创建新的空 DIV 是 slick 库中错误的一部分?
  • @uglycode 不客气!不,错误是unslick 函数没有删除slick 函数生成的元素。这就是我在此行中手动删除它们的原因:$('.your-class .slick-cloned, .your-class .slick-list.draggable').remove();,然后再对slick 函数进行新调用。我希望这会有所帮助。
猜你喜欢
  • 1970-01-01
  • 2014-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多