0

我目前正在使用backbone.js 并遇到一些奇怪的行为,试图在模型和集合之间创建一些关系。

所以这是我的模型/收藏

Element = Backbone.Model.extend({
  name: 'element'
});

Elements = Backbone.Collection.extend({
  name: 'elements',
  model: Element
});

Application = Backbone.Model.extend({
  name: 'app',
  initialize: function() {
    this.elements = new Elements(this.get('elements'));
  } 
});

当我通过检索元素时,application.get('elements')我得到一个' false'询问这个新对象是否是 instanceof Backbone.Collection

var gotElements = application.get('elements');
var isCollection = gotElements instanceof Backbone.Collection;

那么我做错了什么,还是我必须创建一个新的 Collection-Instance 并用我从应用程序收到的 Collection 填充它?

4

2 回答 2

4

在您的初始化函数中,执行 this.elements 会直接在您的模型上设置一个名为“elements”的属性(因此 model.elements 将成为您的 Backbone 集合)。问题是当您尝试通过调用 application.get('elements') 来检索 this.elements 时,您会看到它返回 undefined(这就是为什么它不是 Backbone 集合的实例)。

为了使用 model.get 可以检索模型属性,需要使用 model.set(attribute) 对其进行设置。如果您在控制台中检查模型,您将看到差异。model.set(myData) 将您的数据添加到模型的属性哈希中。model.myData = myData 将“myData”属性直接添加到模型中。

要使其正常工作,您可以执行以下操作:

Element = Backbone.Model.extend({
  name: 'element'
});

Elements = Backbone.Collection.extend({
  name: 'elements',
  model: Element
});

Application = Backbone.Model.extend({
  name: 'app',
  elements: null
});

var application = new Application({
  elements: new Elements()
});

var myElements = application.get('elements');

myElements 现在应该是一个空的 Backbone 集合

于 2013-07-07T17:47:16.970 回答
0

与其将您的集合放入另一个模型中,不如将其放入相应的视图中:

var ListView = new Backbone.View.extend({
     initialize:function(){
         this.Elements= new Elements();
         // more stuff to go
     },
     render:function(){
          _.forEach(this.Elements, function(){
         //Do rendering stuff of indivdual elements and get HTML
         });
         //put HTML in the DOM
     }
});

不需要包含包含多个模型的集合的模型。

编辑:而不是将您的应用程序放入模型中,您应该将其放入视图中。

于 2013-07-07T16:33:21.940 回答