2012-11-01 75 views
0

当我使用Backbone集合的each方法时,我目前正在经历非常不寻常的行为。在我的应用程序中,我允许用户编辑现有模型,其中包括编辑并向该模型添加一些时间限制。该模型及其时间约束与Backbone Relational关联。每次用户点击添加一个新的时间约束,我都会在关系中添加一个TimeConstraint模型而不保存它。如果用户决定取消编辑,则应从关系中删除所有新/未保存的TimeConstraints。但是,当我循环播放集合时,它似乎没有执行最后的迭代。Backbone.Collection.each - 非常奇怪的行为

我构建了一个的jsfiddle说明这种情况在这里:http://jsfiddle.net/richardstokes/ZzFgZ/9/

遵循的步骤如下:

  1. 点击“编辑政策”
  2. 使用“新加入2​​种或多个新的时间限制时间约束”按钮
  3. 通过单击取消编辑‘取消修改’

您会注意到控制台打印出time_constraints集合的开始长度和整理长度,以及删除未保存模型后的中间长度。它似乎总是停下来并在集合中留下一个项目,即使它们都是新的/未保存的。

如果有人能够帮助我解决这个问题,我将不胜感激,这让我坚持了一整天。

回答

1

由于正在迭代timeConstraints的集合,您正在删除项目,这可能会导致未定义的行为。先尝试让新timeConstraints列表,然后将它们作为一个数组删除():

var toRemove = this.model.get('time_constraints').filter(function (timeConstraint) { 
    return timeConstraint.isNew(); 
}); 
this.model.get('time_constraints').remove(toRemove); 
+0

正如感兴趣的事,为什么要删除的项目作为集合被迭代是造成这种不确定的行为?当然,如果迭代结束时集合的长度仍然大于零,迭代应该继续?只是想更充分地理解问题。 –

+0

我没有具体的答案。根据文档,forEach实现遍历在forEach调用开始时出现的元素(请参阅https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/forEach )和下划线源代码。 mozilla doc确实说明在迭代时改变数组的内容意味着可能不会访问某些元素。一般来说,这不是一件安全的事情(而.NET等一些语言会主动引发错误)。 – Yossarian21

+0

好的谢谢你的洞察力。你的解决方案对我来说非常合适将来会更小心不要这样做。 –