这是官方示例应用:
http://documentcloud.github.com/backbone/docs/todos.html
我对集合及其属性localStorage = new Store(..)
这不应该在model
,因为你无论如何都不能collection.save()
吗?
另外,我尝试实现类似的东西,但它不起作用
var Person = Backbone.Model.extend({
defaults: {
name:'no-name',
age:0
}
});
var Persons = Backbone.Collection.extend({
model: Person,
localStorage: new Store('Persons'),
initialize: function(){
console.log('collection initialized');
}
});
window.people = new Persons();
var p1 = new Person({name:'JC',age:24});
p1.save({text:'hello'}); //<--- Uncaught TypeError: Cannot read property 'localStorage' of undefined
任何人都可以帮我解决这个问题吗?
答案 0 :(得分:6)
实际上,集合的.create()
函数允许集合“保存”到localStorage。
createOnEnter: function(e) {
var text = this.input.val();
if (!text || e.keyCode != 13) return;
Todos.create({text: text});
this.input.val('');
},
然后,这允许模型实例使用.save({attr:value})
函数来操作它。
在模型的构造函数中调用modelInstance.save()
而不使用定义的localStorage
属性将导致错误:
Uncaught TypeError: Cannot read property 'localStorage' of undefined
但是,由于模型现在通过collectionInstance.create()
方法保存在localStorage中,现在可以使用modelInstance.save({attr:value})
来修改它。
因此,总而言之,Models仅具有允许持久性的save()
函数,但Collection对象具有允许持久性的create()
函数。
为了使用这些,必须正确设置集合和模型中的REST URL,或者必须在任一构造函数中实例化localStorage插件(取决于设置)
答案 1 :(得分:-1)
我遇到了类似的问题,我想简单地“保存”我从LocalStorage加载的一个集合。我在我的集合上编写了一个save()方法,它只是循环遍历每个模型并调用了model.save()。
MyCollection.save = ->
@each (model) ->
model.save()
然而,关于Backbone.LocalStorage,这有一个很大的缺点。你失去了使用Collection.set({models ...})的所有好处;使用所有添加/合并/删除优点更新您的收藏(提取在线更新或其他内容)。在运行时从集合中删除模型不会将其从本地存储中删除,并且手动识别不匹配的模型并在某种程度上销毁它们会使Backbone.Collection.set()的目的失效;
我发现的一个解决方案是扩充Backbone,使Backbone.Collection.set()在它发现缺失的模型上使用destroy()而不是remove()。 (见BB 1.0.0第705行)
我接下来的另一个解决方案是让所有模型都听取他们自己的'删除'事件,并在发生时调用他们自己的'destroy'方法。这允许Backbone.Collection.set()的删除成为永久删除。
class Model extends Backbone.Model
initialize: ->
@on 'remove', @destroy
这两个意味着你不能永久地“删除”一个模型,这对我来说很好。如果您愿意,您可能会创建一些特殊条件,并以此方式进行管理。