jcr*_*898 2 javascript backbone.js
我正在开发一个项目,我们的数据模型看起来基本上就像这样......
var library = {
location: 'Somewhere'
books: [
{
name: 'Good Book',
publisher: 'Great publisher'
authors: [
{
name: 'Joe Schmoe',
age: '65'
},
{
name: 'Robert Smith',
age: '47'
}
}
}
Run Code Online (Sandbox Code Playgroud)
我试图找出布局模型结构的最佳方法.
就像是...
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
});
Run Code Online (Sandbox Code Playgroud)
这是解决这个问题的最佳方法吗?还有其他人遇到过这样的事吗?
IMO,你是否需要N到N,1到N或任何关系,这在很大程度上都是一个后端问题.除非您严格处理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);
}
});
Run Code Online (Sandbox Code Playgroud)
我已经使用了这个代码六次,每次都对我很好.您可以将相同的模式和假设集扩展到对象模型的每个层.
您可能还需要覆盖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;
}
});
Run Code Online (Sandbox Code Playgroud)
根据您需要走多远的路径,您可能最终会重新创建BB-Relational已经提供的一半功能.使用像这样的插件可能更容易,如果你有足够大的结构,可以使用声明性关系处理.
IMO,值得了解这些基本模式,在深入了解BB-Relational之前知道如何为自己做这件事.但是,如果你受时间的限制,我会从BB-Relational或其他一些关系映射器开始(我认为现在还有一些更多).
| 归档时间: |
|
| 查看次数: |
1758 次 |
| 最近记录: |