我正在开发一个项目,我们的数据模型看起来基本上就像这样...
var library = {
location: 'Somewhere'
books: [
{
name: 'Good Book',
publisher: 'Great publisher'
authors: [
{
name: 'Joe Schmoe',
age: '65'
},
{
name: 'Robert Smith',
age: '47'
}
}
}
我试图找出布局模型结构的最佳方法。
像...一样的东西。
var LibraryModel = Backbone.Model.extend({});
var Book = Backbone.Model.extend({});
var Books = Backbone.Collection.extend({
model: Book
});
var Author = Backbone.Model.extend({});
var Authors = Backbone.Collection.extend({
model: Author
});
这是解决这个问题的最佳方法吗?还有其他人遇到过这样的事吗?
答案 0 :(得分:6)
你是否需要N到N,1到N或任何关系在很大程度上都是后端问题,IMO。除非您严格处理CRUD屏幕,否则Backbone模型通常不直接转换为后端模型,尽管它们通常接近后端模型。
话虽这么说,Backbone-relational绝对是处理这种情况的好选择。它为处理关系代码提供了一组非常强大的功能,值得一试。
如果您想要清除大型插件及其相关配置和要求,可以直接在模型中使用一些简单的技巧。由于您事先了解了自己的数据结构,因此可以对需要编写的代码进行大量假设,而不必创建一个非常灵活的系统,如BB-Relational。
例如,使用上述数据结构将书籍列表添加到库中可以很简单:
Book = Backbone.Model.extend({});
Books = Backbone.Collection.extend({
model: Book
});
Library = Backbone.Model.extend({
initialize: function(){
this.parseBooks();
},
parseBooks: function(){
var data = this.get("books");
this.unset("books", {silent: true});
this.books = new Books(data);
}
});
我已经使用了这个代码了六次,每次都对我很好。您可以将相同的模式和假设集扩展到对象模型的每个层。
您可能还需要覆盖模型上的toJSON
方法:
Library = Backbone.Model.extend({
// ... code from above, here
toJSON: function(){
var json = Backbone.Model.prototype.toJSON.call(this);
json.books = this.books.toJSON();
return json;
}
});
根据您需要走多远的路径,您可能最终会重新创建BB-Relational已经提供的一半功能。使用像这样的插件可能更容易,如果你有足够大的结构,可以使用声明性关系处理。
IMO,值得了解这些基本模式,知道如何在深入了解BB-Relational之前为自己做这件事。但是如果你受时间的限制,我会从BB-Relational或其他一些关系映射器开始(我认为现在还有更多的关系映射器)。
答案 1 :(得分:2)
我不会那样解决这个问题,因为你有一个N到N的关系, 1本书可以有多位作者 并且1位作者最有可能写了超过1本书。
我会看一下Backbone Relational插件
它不是默认的主干,但它是我能想到的最佳方式。
然而,如果您只需要一个小解决方案 您可以将所有作者都放在集合中,并在图书模型中使用简单的作者ID数组。