Backbone Collection.each方法影响每一个模型

时间:2013-12-03 01:25:23

标签: javascript backbone.js coffeescript

我从外面点击时会在集合上触发'removeAll'。它看起来像是:

绑定内部集合构造函数:

$('.empty').click => this.removeAll()

清空购物车:

removeAll: ->
this.each( (item) ->
  item.setQuantity(0)
)

但是只影响其他所有模型。

将数量更改为0会触发从集合中删除。这会触发购物车的视图重新渲染,删除未使用的(数量== 0)模型的视图。

当我只是从回调内部登录时也会发生这种情况 - 我只得到一半的消息...... 编辑:当我独家使用console.log时,我收到所有消息。那么,从集合中删除模型是否会干扰从集合中删除模型?

怎么了? RTL

1 个答案:

答案 0 :(得分:2)

你可能在迭代它的同时从集合中删除了东西。例如,这个简化的例子:

class M extends Backbone.Model

class C extends Backbone.Collection
    model: M

c = new C([
    { id: 1, amount: 1 },
    { id: 2, amount: 1 },
    { id: 3, amount: 6 }
])

c.on('change:amount', (m) ->
     c.remove(m) if(m.get('amount') == 0)
)

c.each (item) -> item.set(amount: 0)

c留给一个模型,即使c.each应该将它们全部杀掉。

演示:http://jsfiddle.net/ambiguous/4nKHE/

发生了什么事?好吧,c.each将跟踪迭代时哪个元素是一个,但c.remove将更改基础数组,而c.each将无法知道它必须调整其“当前元素”索引让事情迷失了。这是一个“在迭代时改变一个集合”的类,有一些装饰。

只需使用reset清空集合即可避免整个反馈问题:

$('.empty').click => this.reset()

演示:http://jsfiddle.net/ambiguous/tpLXW/

完成整理后,请停止绑定到集合中的用户界面元素。你真的应该在视图中有.empty然后该视图会有:

events:
    'click .empty': 'emptyCart'
emptyCart: ->
    @collection.reset()

演示:http://jsfiddle.net/ambiguous/gq3gv/