Backbone localStorage不更新模型

时间:2018-03-28 08:22:22

标签: cordova backbone.js collections model

我正在为iOS和Android构建Cordova应用程序。因此,我使用Backbone与Backbone.LocalStorage将我的数据存储在设备上。

我的收藏和模型看起来像这样

App.collections.Articles = Backbone.Collection.extend({
    model: App.models.Article,
    localStorage: new Backbone.LocalStorage("articles"),
});

App.models.Article = Backbone.Model.extend({
    defaults:{
        read: false,
    },
});

我有一个ajax调用来从drupal系统获取我的数据。获得数据后,我使用这个小代码将其保存到集合中。

    App.data.Articles = new App.collections.Articles();  

    $.each(data.articles, function(i,obj) {
        var model = App.data.Articles.add(obj);
        model.set({read: true});
        model.save();
    });

所以我从ajax调用中获取数据并创建一个模型,我将其添加到我的集合中。在那之后我"保存"该模型到骨干本地存储。

一切正常。我可以稍后获取我的收藏,并在没有互联网时使用本地数据。 唯一不起作用的是,我的模型不会更新。因此,它无法识别来自ajax调用的数据是新的还是已更改的。如果我做"添加",它将添加一个全新的模型。因为Backbone.localStorage在保存的模型上使用它自己的idAttribute。因此,它不会识别模型已经存在,并且它只应该更新模型。

我该怎么办?有没有办法比较模型ID和localStorage id。

这就是我存储的数据的样子。 它创造了一篇"文章"具有所有ID的对象。它通过它的新ID创建每个文章对象。

articles: cfbc6a16-c3c4-cb1b-6667-fb1ecf00717f,da65ce5a-dbbb-d8ca-4117-50d0a0fa3bf4,f2af3c83-bd3c-de87-7953-d992348c46cc,9a3ca688-0ba9-ee87-4fb3-878d1eca46bc,f1f9e082-c1ff-5d6b-9c13-54ddd3a12158

articles-9a3ca688-0ba9-ee87-4fb3-878d1eca46bc

1 个答案:

答案 0 :(得分:1)

您可以使用

  

Collection.set

     

set方法使用传递的模型列表对集合执行“智能”更新。如果列表中的模型尚未包含在集合中,则会添加该模型;如果模型已经在集合中,则其属性将被合并;如果集合包含列表中不存在的任何模型,它们将被删除。当发生这种情况时,所有适当的“添加”,“删除”和“更改”事件都会被触发。返回集合中的触摸模型。如果您要自定义行为,可以使用以下选项将其停用:{add: false}{remove: false}{merge: false}