Backbone.js 主干、集合、每个-非常奇怪的行为

Backbone.js 主干、集合、每个-非常奇怪的行为,backbone.js,backbone-relational,Backbone.js,Backbone Relational,在使用主干集合的每个方法时,我当前遇到了非常不寻常的行为。在我的应用程序中,我允许用户编辑现有模型,包括编辑和向该模型添加大量时间约束。该模型及其时间约束与主干关系连接。每次用户单击添加新的时间约束时,我都会向关系中添加一个时间约束模型,而不保存它。如果用户随后决定取消编辑,则应从关系中删除所有新的/未保存的时间约束。然而,当我循环我的集合时,它似乎没有执行最后的迭代 我在这里构建了一个JSFIDLE来演示这种行为: 以下步骤是: 单击“编辑策略” 使用“新建时间约束”按钮添加2个或更多新的时间

在使用主干集合的
每个
方法时,我当前遇到了非常不寻常的行为。在我的应用程序中,我允许用户编辑现有模型,包括编辑和向该模型添加大量时间约束。该模型及其时间约束与主干关系连接。每次用户单击添加新的时间约束时,我都会向关系中添加一个时间约束模型,而不保存它。如果用户随后决定取消编辑,则应从关系中删除所有新的/未保存的时间约束。然而,当我循环我的集合时,它似乎没有执行最后的迭代

我在这里构建了一个JSFIDLE来演示这种行为:

以下步骤是:

  • 单击“编辑策略”
  • 使用“新建时间约束”按钮添加2个或更多新的时间约束
  • 单击“取消编辑”取消编辑
  • 您会注意到控制台打印时间约束集合的起始长度和结束长度,以及删除未保存模型后的中间长度。它似乎总是停下来,在收藏中留下一件物品,即使它们都是新的/未保存的


    如果有人能帮我解决这个问题,我将不胜感激,因为我一整天都被卡住了。

    在迭代时间约束集合时,您正在删除项,这可能会导致未定义的行为。尝试首先获取新时间约束列表,然后将其作为数组传递以删除()


    有趣的是,为什么在迭代集合时删除项会导致这种未定义的行为?当然,如果迭代结束时集合的长度仍然大于零,那么迭代应该继续吗?我只是想更全面地理解这个问题。我没有具体的答案。根据文档,forEach实现在调用forEach(请参阅)开始时出现的元素和下划线源代码上循环。mozilla文档确实指出,在迭代时更改数组的内容意味着可能无法访问某些元素。一般来说,这不是一件安全的事情(有些语言,如.NET,会主动提出错误)。好的,谢谢你的见解。你的解决方案对我非常有效。今后将更加小心,不要这样做。
    var toRemove = this.model.get('time_constraints').filter(function (timeConstraint) {
        return timeConstraint.isNew();
    });
    this.model.get('time_constraints').remove(toRemove);