sntran关于您的问题的出处是正确的:您在迭代数组时正在修改它。
您从nOrder: null
模型列表的开头开始使用新模型:
splice.apply(this.models, [index, 0].concat(models));
然后add
循环遍历触发'add'
事件的模型:
for (i = 0, length = this.models.length; i < length; i++) {
if (!cids[(model = this.models[i]).cid]) continue;
options.index = i;
model.trigger('add', model, this, options);
}
但是在你的'add'
回调中,你修改了模型:
if(model.get('nOrder') == null)
model.set('nOrder', _.max(collection.pluck('nOrder')) + 1);
然后对集合进行排序:
collection.sort({silent: true});
这两个动作this.models[0]
在this.models[3]
事件触发循环中移动;但是i
for 那个循环会一直滴答作响,新的this.models[3]
(曾经是 at 0
)将if (!cids[(model = this.models[i]).cid])
再次通过测试,这是你的第二个'add'
事件。
您可以观看此版本的小提琴作品,以了解集合的数组如何在您背后发生变化:
http://jsfiddle.net/ambiguous/p8Fp4/
我认为最简单的解决方案是向append
您的集合添加一个方法,该方法nOrder
在模型上设置适当的值,然后将其添加到集合中:
append: function(m) {
var nOrder = _.max(this.pluck('nOrder')) + 1;
if(m instanceof Backbone.Model)
m.set({ nOrder: nOrder });
else
m.nOrder = nOrder;
this.add(m);
}
然后您的'add'
回调可以不理会nOrder
并停止对集合进行排序。
演示:http: //jsfiddle.net/ambiguous/JqWVP/
您也可以覆盖集合的add
方法,但如果您想正确地执行此操作,则要复杂得多。