Backbone.js嵌套对象结构

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)

这是解决这个问题的最佳方法吗?还有其他人遇到过这样的事吗?

Der*_*ley 6

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或其他一些关系映射器开始(我认为现在还有一些更多).