主干可以将属性包含集合?(Backbone can an attribute contain a c

2019-08-06 18:13发布

在骨干什么是存储的作者和书之间的关系(在localStorage的)所需的方式。

是否有可能有一个集合作为属性还是应该阵列中使用还是...?

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

Answer 1:

还有就是在骨干处理嵌套集合没有唯一正确的方法。 从报价骨干常见问题 :

骨干不包括嵌套模型和收藏或直接支持“有很多个”协会,因为有许多很好的模式为客户端上的造型结构化数据,以及骨干应该执行任何他们提供了基础。

常见问题解答还提出一个模式,并提供了一个链接到扩展,插件,资源页面,它链接到您可以使用处理嵌套的模型和模型关系许多图书馆。

这就是说,我有时走近这个问题是这样的:

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

评论希望解释它是如何工作的,但问题是,你可以使用该模型,你通常会:有一个集合,数组或没有初始化的孩子,从服务器获取,并将它们发送到服务器,它都应该透明地工作。 有相当多的样板代码来写,但它是相对简单的抽象成一个基类,如果你发现自己重复同样的代码。

编辑:小校,你不需要的books中所定义的defaults对象,因为构造函数,如果缺失创建它。

/代码样品未测试



文章来源: Backbone can an attribute contain a collection?