从模型中检索Backbone Collection并将其保存为集合

时间:2013-07-07 16:11:40

标签: javascript backbone.js collections model

我目前正在使用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”,询问此新对象是否是Backbone.Collection的实例。

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

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

2 个答案:

答案 0 :(得分: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 Collection

答案 1 :(得分: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
     }
});

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

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