当我使用Backbone集合的each
方法时,我目前正在经历非常不寻常的行为。在我的应用程序中,我允许用户编辑现有模型,其中包括编辑并向该模型添加一些时间限制。该模型及其时间约束与Backbone Relational关联。每次用户点击添加一个新的时间约束,我都会在关系中添加一个TimeConstraint模型而不保存它。如果用户决定取消编辑,则应从关系中删除所有新/未保存的TimeConstraints。但是,当我循环播放集合时,它似乎没有执行最后的迭代。Backbone.Collection.each - 非常奇怪的行为
我构建了一个的jsfiddle说明这种情况在这里:http://jsfiddle.net/richardstokes/ZzFgZ/9/
遵循的步骤如下:
- 点击“编辑政策”
- 使用“新加入2种或多个新的时间限制时间约束”按钮
- 通过单击取消编辑‘取消修改’
您会注意到控制台打印出time_constraints集合的开始长度和整理长度,以及删除未保存模型后的中间长度。它似乎总是停下来并在集合中留下一个项目,即使它们都是新的/未保存的。
如果有人能够帮助我解决这个问题,我将不胜感激,这让我坚持了一整天。
正如感兴趣的事,为什么要删除的项目作为集合被迭代是造成这种不确定的行为?当然,如果迭代结束时集合的长度仍然大于零,迭代应该继续?只是想更充分地理解问题。 –
我没有具体的答案。根据文档,forEach实现遍历在forEach调用开始时出现的元素(请参阅https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/forEach )和下划线源代码。 mozilla doc确实说明在迭代时改变数组的内容意味着可能不会访问某些元素。一般来说,这不是一件安全的事情(而.NET等一些语言会主动引发错误)。 – Yossarian21
好的谢谢你的洞察力。你的解决方案对我来说非常合适将来会更小心不要这样做。 –