Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/405.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从模型中检索主干集合并将其保留为集合_Javascript_Backbone.js_Collections_Model - Fatal编程技术网

Javascript 从模型中检索主干集合并将其保留为集合

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',

我目前正在玩backbone.js,遇到了一些wierd行为,试图在模型和集合之间创建一些关系

这是我的模型/收藏

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