我从外面点击时会在集合上触发'removeAll'。它看起来像是:
绑定内部集合构造函数:
$('.empty').click => this.removeAll()
清空购物车:
removeAll: ->
this.each( (item) ->
item.setQuantity(0)
)
但是只影响其他所有模型。
将数量更改为0会触发从集合中删除。这会触发购物车的视图重新渲染,删除未使用的(数量== 0)模型的视图。
当我只是从回调内部登录时也会发生这种情况 - 我只得到一半的消息...... 编辑:当我独家使用console.log时,我收到所有消息。那么,从集合中删除模型是否会干扰从集合中删除模型?
怎么了? RTL
答案 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()