Backbone Collection.每个方法都会影响每隔一个模型

Backbone Collection.each method affects every second model

本文关键字:一个 模型 Collection 方法 Backbone 影响      更新时间:2024-01-24

>我在从外部单击时在集合上触发"全部删除"。它看起来像这样:

绑定在集合构造函数中:

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

清空购物车:

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

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

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

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

怎么了?RtL

您可能在迭代集合的同时从集合中删除内容。例如,这个简化的例子:

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/