2013-07-07 52 views
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; 

所以我做错了什么,或者我必须创建一个新的集合实例和与我从应用程序接收收集填满它?

回答

4

在你的初始化函数做this.elements将名为直接在模型“元素”(这样model.elements将是您的收藏骨干)财产。问题是当你试图通过调用application.get('elements')来检索this.elements时,你会看到它返回undefined(这就是为什么它不是Backbone集合的一个实例)。

为了使模型属性使用它需要与model.set(属性)设定model.get为检索。如果您在控制台中检查模型,您将看到不同之处。 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现在应该是一个空的骨干收集

+0

谢谢mcbex!我没有像以前那么困惑。根据我的实际问题,你的答案完全正确。我试图在服务器和客户机上重用我的应用程序的模型和确切状态,但它似乎保持同步更像是一种迷惑,而不是它可以带来的好处。 – Alx

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

没有必要含含几种模式集合的模式。

编辑:而不是把你的应用程序放入模型,你应该把它放到一个视图。

+0

但后来,其中的数据(模型)和UI(视图)之间的分离?我希望在客户端有一个表示整个应用程序状态的“对象”,因此将其放入视图中并不合适,因为我不能简单地将视图替换为让我们说更详细的视图来显示更多的属性的模型。 – Alx

+0

是的,你是对的。如果你想分开重复使用你的集合,把它连接到一个视图是没有意义的。我的方法是针对简单的情况,即每个集合只有一个视图。 –

+0

非常感谢Lilith2k3,现在有道理;) – Alx