创建模型时骨干无限循环

时间:2012-12-18 06:41:30

标签: javascript backbone.js infinite-loop

我认为,我正在做一些相当标准的事情。

型号:


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);

做上述工作,以及我需要它的工作,但它真的很糟糕。这很糟糕,因为每次我们进行新的添加和同步时,每次在此页面加载时调用add和sync时,都会调用JSON 1次。因此,如果添加3个项目,则会获得6个toJSON调用(第一个为1,第二个为2,第三个为3)。而且,它不是那么干净。我还注意到toJSON调用了主干this.attributes,第一次创建是正确的。第二次它就像this.attributes == backbone或者其他东西。非常非常奇怪。它拥有Backbone的所有方法。这就像克隆做了一个深刻的克隆或其他东西。

2 个答案:

答案 0 :(得分:2)

您的Backbone版本(v0.9.9)与localstorage附加组件的版本不匹配。请务必从Backbone repo获取最新版本的localstorage附加组件,它将解决此问题。

答案 1 :(得分:1)

归功于Derick Bailey,我最终通过恢复到Backbone的0.9.2来修复它。我尝试使用最新的localStorage插件似乎没有解决它。也许我使用的是其他来源?我正在使用这个开发:

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