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