Javascript 从模型中检索主干集合并将其保留为集合
我目前正在玩backbone.js,遇到了一些wierd行为,试图在模型和集合之间创建一些关系 这是我的模型/收藏Javascript 从模型中检索主干集合并将其保留为集合,javascript,backbone.js,collections,model,Javascript,Backbone.js,Collections,Model,我目前正在玩backbone.js,遇到了一些wierd行为,试图在模型和集合之间创建一些关系 这是我的模型/收藏 Element = Backbone.Model.extend({ name: 'element' }); Elements = Backbone.Collection.extend({ name: 'elements', model: Element }); Application = Backbone.Model.extend({ name: 'app',
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;
那么,我是做错了什么,还是必须创建一个新的集合实例,并用我从应用程序收到的集合填充它?与其将集合放入另一个模型中,不如将其放入相应的视图中:
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
}
});
不需要一个包含多个模型的集合的模型
编辑:您应该将应用程序放入视图中,而不是将其放入模型中。您应该将其放入相应的视图中,而不是将收藏放入另一个模型中:
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
}
});
不需要一个包含多个模型的集合的模型
编辑:你不应该把你的应用程序放到模型中,而应该把它放到视图中。在初始化函数中,这样做。元素直接在你的模型上设置一个名为“元素”的属性(因此Model.elements将是你的主干集合)。问题是,当您试图通过调用application.get('elements')检索this.elements时,您将看到它返回未定义的(这就是为什么它不是主干集合的实例) 为了使用model.get检索模型属性,需要使用model.set(属性)对其进行设置。如果您在控制台中检查模型,您将看到差异。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现在应该是一个空的主干集合在初始化函数中执行此操作。elements直接在模型上设置一个名为“elements”的属性(因此model.elements将是主干集合)。问题是,当您试图通过调用application.get('elements')检索this.elements时,您将看到它返回未定义的(这就是为什么它不是主干集合的实例)
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'));
}
});
为了使用model.get检索模型属性,需要使用model.set(属性)对其进行设置。如果您在控制台中检查模型,您将看到差异。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现在应该是一个空的主干集合,但是,数据(模型)和ui(视图)之间的分离在哪里呢?我希望有一个“对象”代表客户端上的整个应用程序状态,因此将其放在视图中是没有意义的,因为我不能简单地用显示模型更多属性的更详细视图替换视图。是的,你是对的。如果希望对集合进行解耦重用,将其耦合到视图是没有意义的。我的方法是针对一个简单的情况,即每个集合只有一个视图。非常感谢Lilith2k3,现在有意义了;)但是,数据(模型)和ui(视图)之间的分离在哪里呢?我希望有一个“对象”代表客户端上的整个应用程序状态,因此将其放在视图中是没有意义的,因为我不能简单地用显示模型更多属性的更详细视图替换视图。是的,你是对的。如果希望对集合进行解耦重用,将其耦合到视图是没有意义的。我的方法是针对简单的情况,每个集合只有一个视图谢谢mcbex!我不像以前那么困惑了。根据我的实际问题,你的回答很好。我正在尝试在服务器和客户端上重用模型和应用程序的确切状态,但它似乎使两者保持同步是一件令人费解的事,而不是它所能带来的好处。谢谢mcbex!我不像以前那么困惑了。根据我的实际问题,你的回答很好。我试图在服务器和客户机上重用模型和应用程序的确切状态,但它似乎使两者保持同步是一个模糊的过程,而不是带来好处。
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'));
}
});