Backbone.js嵌套对象结构

时间:2012-02-08 02:59:15

标签: 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'
        }
    }  
}

我试图找出布局模型结构的最佳方法。

像...一样的东西。

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
});

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

2 个答案:

答案 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数组。