1

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

模型:


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 个)。而且,也不是很干净。我还注意到在toJSON主干的调用中this.attributes第一次是正确的。第二次就像 this.attributes == 骨干之类的。非常非常奇怪。它具有 Backbone 的所有方法。就好像克隆做了一个深度克隆什么的。

4

2 回答 2

2

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

于 2012-12-18T20:52:15.917 回答
1

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

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

于 2012-12-22T22:37:06.713 回答