【问题标题】:Backbone Collection.each method affects every second modelBackbone Collection.each 方法影响每隔一个模型
【发布时间】:2013-12-03 11:02:36
【问题描述】:

我在从外部点击收集时触发“removeAll”。看起来是这样的:

在集合构造函数中绑定:

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

清空购物车:

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

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

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

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

怎么了? 右下角

【问题讨论】:

    标签: javascript backbone.js coffeescript


    【解决方案1】:

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

    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.each 应该已经将他们全部杀死,但c 会留下一个模型。

    演示: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/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多