在骨干网中,在作者和书籍之间存储关系(在localstorage中)的理想方式是什么。
是否可以将集合作为属性或使用数组或......?
var book = Backbone.Model.extend({
defaults:{
title: ''
}
});
var books = Backbone.Collection.extend({
model: book
});
var author = Backbone.Model.extend({
defaults:{
firstName: '',
lastName: '',
books: new books()
}
});
var authors = Backbone.Collection.extend({
model: author,
localStorage: new Backbone.LocalStorage("authors")
});
答案 0 :(得分:8)
在Backbone中没有一种真正的方法来处理嵌套集合。引自Backbone FAQ:
Backbone不包括对嵌套模型和集合的直接支持,或者“有很多”关联,因为在客户端有许多用于建模结构化数据的良好模式,Backbone应该为实现其中任何一个提供基础。
FAQ还提供了一种模式,并提供了Extensions, Plugins, Resources页面的链接,该页面链接到许多可用于处理嵌套模型和模型关系的库。
那就是说,我有时会这样解决问题:
var Author = Backbone.Model.extend({
initialize: function(attrs, options) {
//convert the child array into a collection, even if parse was not called
var books = attrs ? attrs.books : [];
if(!(books instanceof Books)) {
this.set('books', new Books(books), {silent:true});
}
},
//the books property does not need to be declared in the defaults
//because the initialize method will create it if not passed
defaults: {
firstName: '',
lastName: ''
},
//override parse so server-sent JSON is automatically
//parsed from books array to Books collection
parse: function(attrs) {
attrs.books = new Books(attrs.books);
return attrs;
},
//override toJSON so the Books collection is automatically
//converted to an array
toJSON: function() {
var json = Backbone.Model.prototype.toJSON.call(this);
if(json.books instanceof Books) {
json.books = json.books.toJSON();
}
return json;
}
});
这些评论有希望解释它是如何工作的,但关键是你可以像平常一样使用模型:用一个集合,一个数组或什么都没有初始化子节点,从服务器获取,将它们发送到服务器,它应该都是透明的。编写的样板代码相当多,但如果您发现自己重复相同的代码,则抽象到基类中相对简单。
编辑:小修正,您不需要books
对象中定义的defaults
,因为构造函数会在缺少时创建它。
/未经测试的代码示例