Javascript Backbone.js bug?

Javascript Backbone.js bug?,javascript,backbone.js,Javascript,Backbone.js,test.html中有以下内容: <script> var Foo = Backbone.Model.extend({ initialize: function(options) { console.log('hello!'); } }); var Bar = Backbone.Collection.extend({ model: Foo }); var m = new Bar({}); </script> 没有“你好!”在控制台输出中。因此,为集合

test.html中有以下内容:

<script>
var Foo = Backbone.Model.extend({
  initialize: function(options) {
    console.log('hello!');
  }
});
var Bar = Backbone.Collection.extend({
  model: Foo
});
var m = new Bar({});
</script>

没有“你好!”在控制台输出中。因此,为集合声明模型将调用该模型的
initialize
函数。我认为这种行为有点愚蠢。我没有通读主干网代码,但这有什么原因吗?

嗯,代码的行为没有问题。
在集合定义中传递模型时,指定该集合中的每个模型的类型为
Foo

当您初始化集合
newbar({})
时,您将一个模型传递给集合(尽管,正如@alexanderb所述,我认为集合需要一个数组作为第一个参数),并对其进行初始化,从而输出
'hello!'
例如,如果未将任何模型传递给集合构造函数:

new Bar();// no console output
不会有控制台输出,另一方面,如果要传递对象数组,则集合将初始化所有提供的模型:

new Bar([{},[},{}]);// will output 'hello!' 3 times

嗯,代码的行为没有问题。
在集合定义中传递模型时,指定该集合中的每个模型的类型为
Foo

当您初始化集合
newbar({})
时,您将一个模型传递给集合(尽管,正如@alexanderb所述,我认为集合需要一个数组作为第一个参数),并对其进行初始化,从而输出
'hello!'
例如,如果未将任何模型传递给集合构造函数:

new Bar();// no console output
不会有控制台输出,另一方面,如果要传递对象数组,则集合将初始化所有提供的模型:

new Bar([{},[},{}]);// will output 'hello!' 3 times

我相信集合的构建者期待着模型的数组。所以,你应该做的是:

var collection = new Bar( [ {} ] );

在那里,应该调用model的initialize方法。

我相信collection的构造函数期望得到model的数组。所以,你应该做的是:

var collection = new Bar( [ {} ] );

在这里,应该调用模型的initialize方法。

经过一点调查,我发现这里是主干。收集函数如下:

var Collection = Backbone.Collection = function(models, options) {
  options || (options = {});
  if (options.model) this.model = options.model;
  if (options.comparator !== void 0) this.comparator = options.comparator;
  this._reset();
  this.initialize.apply(this, arguments);
  if (models) this.reset(models, {silent: true, parse: options.parse});
};
因此,如果像这样为集合创建一个initialize方法

initialize: function() {
  console.log('hello collection!');   
}
您将注意到,hello集合记录在hello from模型之前。因此,在调用
initialize
-之后,模型初始化必须来自
reset
功能<代码>rest
将不会被调用,除非您已将模型传递到您的集合中,而您快速浏览似乎并没有做到这一点,但实际上是这样

var m = new Bar({});
主干将
{}
解释为一个模型,从而在
重置
-函数中对其进行初始化。但是你说的
{}
不是一个模型吗?主干并不太挑剔,它只需要一个可以包含或不包含模型属性的散列数组。
reset
-功能最终导致
add
-功能,最后所有的路都通向罗马,或者我应该说
\u prepareModel
-功能吗

_prepareModel: function(attrs, options) {
  if (attrs instanceof Model) {
    if (!attrs.collection) attrs.collection = this;
    return attrs;
  }
  options || (options = {});
  options.collection = this;
  var model = new this.model(attrs, options);
  if (!model._validate(model.attributes, options)) return false;
  return model;
}
这里发生的事情是,集合检查是否已向其传递了模型或属性哈希,在属性哈希的情况下,它只是基于其定义的模型创建一个新模型并传递该哈希


希望这不仅能解决问题,还能让人们对那里发生的事情有更多的了解。当然,我也热情地鼓励大家阅读主干源代码。

经过一番调查,我发现了主干。收集功能如下:

var Collection = Backbone.Collection = function(models, options) {
  options || (options = {});
  if (options.model) this.model = options.model;
  if (options.comparator !== void 0) this.comparator = options.comparator;
  this._reset();
  this.initialize.apply(this, arguments);
  if (models) this.reset(models, {silent: true, parse: options.parse});
};
因此,如果像这样为集合创建一个initialize方法

initialize: function() {
  console.log('hello collection!');   
}
您将注意到,hello集合记录在hello from模型之前。因此,在调用
initialize
-之后,模型初始化必须来自
reset
功能<代码>rest
将不会被调用,除非您已将模型传递到您的集合中,而您快速浏览似乎并没有做到这一点,但实际上是这样

var m = new Bar({});
主干将
{}
解释为一个模型,从而在
重置
-函数中对其进行初始化。但是你说的
{}
不是一个模型吗?主干并不太挑剔,它只需要一个可以包含或不包含模型属性的散列数组。
reset
-功能最终导致
add
-功能,最后所有的路都通向罗马,或者我应该说
\u prepareModel
-功能吗

_prepareModel: function(attrs, options) {
  if (attrs instanceof Model) {
    if (!attrs.collection) attrs.collection = this;
    return attrs;
  }
  options || (options = {});
  options.collection = this;
  var model = new this.model(attrs, options);
  if (!model._validate(model.attributes, options)) return false;
  return model;
}
这里发生的事情是,集合检查是否已向其传递了模型或属性哈希,在属性哈希的情况下,它只是基于其定义的模型创建一个新模型并传递该哈希


希望这不仅能解决问题,还能让人们对那里发生的事情有更多的了解。当然,我热情地鼓励大家阅读主干源代码。

如果Mike看
m
,他会发现其中有一个模型,而该模型没有任何属性。如果Mike看
m
,他会发现其中有一个模型,而该模型没有任何属性。