【问题标题】:Backbone can an attribute contain a collection?Backbone 一个属性可以包含一个集合吗?
【发布时间】:2013-01-14 17:34:52
【问题描述】:

在主干中存储作者和书籍之间的关系(在本地存储中)的所需方式是什么。

是否可以将集合作为属性,或者应该使用数组还是...?

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

【问题讨论】:

    标签: javascript backbone.js


    【解决方案1】:

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

    cmets 希望能解释它是如何工作的,但关键是您可以像往常一样使用该模型:使用集合、数组或任何内容初始化子项,从服务器获取,将它们发送到服务器,这一切都应该透明地工作。有相当多的样板代码要编写,但如果您发现自己重复相同的代码,则抽象为基类相对简单。

    编辑:小修正,您不需要在defaults 对象中定义books,因为如果缺少,构造函数会创建它。

    /代码示例未测试

    【讨论】:

      猜你喜欢
      • 2012-01-22
      • 2012-07-25
      • 2021-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-17
      相关资源
      最近更新 更多