获取后,新保存的Backbone模型不会出现在集合中

时间:2013-06-13 20:30:58

标签: javascript backbone.js local-storage

我正在使用骨干本地存储并遇到一些奇怪的行为。

我有一个定义,实例化和获取的模型和集合:

MyModel = Backbone.Model.extend({
        localStorage: new LocalStore('example-myModels')
        //note: LocalStore = Backbone.LocalStore -> https://github.com/jeromegn/Backbone.localStorage
});

MyCollection = Backbone.Collection.extend({
        model : MyModel,
        localStorage: new LocalStore('example-myModels')
});

var myCollection = new MyCollection();
myCollection.fetch(...);

然后,此集合将作为列表显示给用户。用户可以将一个项目“添加”到集合中,最终生成此代码:

var newModel = new MyModel();
newModel.save(newModelAttributes, {
    success: function(newlySavedModel) {
        myCollection.add(newlySavedModel);
    }
);

此时myCollection具有新添加的模型,我可以看到在localStorage数据库中成功创建的记录:

预先保存LocalStorage:

enter image description here

保存后LocalStorage:

enter image description here

用户添加记录后的下一步是返回列表,此时再次获取集合:

myCollection.fetch();

现在myCollection 不再包含新记录。无论我获取多少次,都不会检索新记录 - 即使我可以在localStorage数据库中看到它。我也尝试创建一个新的Collection实例并获取它,但它产生相同的结果。如果我重新加载浏览器,新记录将按预期显示。任何人都知道发生了什么事吗?我觉得我在这里缺少一些基本的东西......

此处提供了一个重现问题的运行示例:http://jsbin.com/iyorax/2/edit(确保控制台可见,然后单击“使用JS运行”)

提前致谢!

3 个答案:

答案 0 :(得分:4)

您的模型和集合需要共享对LocalStore的同一实例的引用,而现在您正在创建两个不同的对象。要解决此问题,请在模型或集合之外创建LocalStore对象,并在模型和集合的构造函数中传递对它的引用。

答案 1 :(得分:1)

我有一个使用Backbone.localstorage的应用程序,对我来说有用的是我先将模型添加到集合中,然后将save调用到模型中。像这样。

var newModel = new MyModel();
myCollection.add(newModel)
newModel.save();

我不是百分百肯定,但我的理由是,您的模型已保存,但您的集合未保存,并且可能未更新索引,并且在您调用fetch时,您将获得未更新的集合。< / p>

希望有所帮助。

答案 2 :(得分:0)

由于重复ID

,我可以想到的唯一原因是该模型不存在于该集合中

我没有在模型上看到定义的IdAttribute。这有时可能是一个问题。