【问题标题】:Backbone infinite loop when creating models创建模型时的主干无限循环
【发布时间】:2012-12-18 06:41:30
【问题描述】:

我认为我正在做一些非常标准的事情。

型号:


app.model.Todo = Backbone.Model.extend({
    defaults: {
        task: ''
        , completed: 0
        , attachments: []
        , note: ''
    }
});

收藏:


var Todos = Backbone.Collection.extend({
    model: app.model.Todo

    , localStorage: new Store('Todos')

    , incomplete: function () {
        return this.filter(function (todo) {
            return !todo.get('completed')
        });
    }

    , complete: function () {
        return this.filter(function (todo) {
            return todo.get('completed')
        });
    }

    , comparator: function(todo) {
        return todo.get('order');
    }
});

app.collection.Todos = new Todos();

那么,如果我这样做:

app.collection.Todos.create({task: 'hi'});
app.collection.Todos.create({task: 'hi'});

第二个永远不会工作。我得到一个无限循环(Firefox 上的递归过多,Chrome 上的 stack_overflow 太多)。

我真的很茫然。我也注释掉了所有事件。

似乎它在主干中失控:

// Return a copy of the model's `attributes` object.
toJSON: function(options) {
    return _.clone(this.attributes);
}, 

更新:如果我将 id: 0 或任何 id 添加到模型中,错误就会停止,但如果我给它一个自定义 ID(即 new Date().getTime() 错误再次发生。就像每当我创建一个独特的项目时它就会爆炸.

更新 2:

var todo = new gator.model.Todo({task: actionbarVal});
gator.collection.Todos.add(todo);
gator.collection.Todos.sync('create', todo);

做上述有点工作,我需要它来工作,但它真的很糟糕。这很糟糕,因为每次我们执行新的添加和同步时,它都会在此页面加载时每次调用添加和同步时调用 toJSON 1 次。因此,如果添加 3 个项目,您将获得 6 个 toJSON 调用(第一个调用 1 个,第二个调用 2 个,第三个调用 3 个)。而且,也不是很干净。我还注意到在骨干网this.attributestoJSON 调用中,第一次创建是正确的。第二次就像 this.attributes == 骨干之类的。非常非常奇怪。它具有 Backbone 的所有方法。就好像克隆做了一个深度克隆什么的。

【问题讨论】:

  • 恐怕我在documentation 中找不到modelscreate,它只存在于collections。跨度>
  • 如果您在集合上调用 create 似乎可以正常工作:jsfiddle.net/ambiguous/8Szgv PS:如果您的 defaults 中有一个数组(或其他可变对象),那么您应该使用默认函数而不是比一个对象。
  • @Cyclone 该死的,我的错。那是一种类型。我的意思是一个集合。固定。
  • @OscarGodson 以了解 SO 的未来清洁度,您能否将解决方案粘贴为对此的答案,以免它看起来没有答案/已解决。 :)
  • @muistooshort 我不知道 :( 我几乎删除了所有代码,但它仍在发生。我删除了默认值。我的集合只是设置了一个模型,localStorage 然后app.collections.Todos = new Todos() 和“app.js”只有 app = {model: {}, collection: {}, view: {}}window.app = app;

标签: javascript backbone.js infinite-loop


【解决方案1】:

您的 Backbone (v0.9.9) 版本与 localstorage 插件的版本不匹配。请务必从 Backbone 存储库获取最新版本的本地存储插件,它将解决此问题。

【讨论】:

    【解决方案2】:

    感谢 Derick Bailey,我最终通过恢复到 Backbone 的 0.9.2 来修复它。我尝试使用最新的 localStorage 插件似乎并没有解决它。也许我使用了不同的来源?我正在使用这个:

    https://github.com/jeromegn/Backbone.localStorage

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-20
      • 2017-11-13
      • 2021-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多