繁体   English   中英

Backbone.js错误?

[英]Backbone.js bug?

我在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>

事实证明,在初始化变量m时,将调用Foo的initialize函数。 因此,在Firebug控制台中,我得到“ hello!”。 当我注释掉该行时:

model: Foo,

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

好吧,代码的行为没有错。
在集合定义中传递模型时,您指定该集合中的每个模型都将为Foo类型。
当您初始化集合new Bar({}) ,您将模型传递给集合(尽管,如@alexanderb所述,我认为集合期望将数组作为第一个参数)并对其进行初始化,从而输出'hello!'
例如,如果您不将任何模型传递给集合构造函数:

new Bar();// no console output

没有控制台输出,另一方面,如果您传递对象数组,则该集合将初始化所有提供的模型:

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

我相信集合的构造者期望模型的阵列 因此,您应该做的是:

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

在那里,应该调用模型的初始化方法。

经过一番调查,我发现这里的Backbone.Collection函数如下:

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

因此,如果您像这样为您的Collection创建一个初始化方法

initialize: function() {
  console.log('hello collection!');   
}

您会注意到,在收集来自模型的问候之前,已记录了问候集合。 因此,模型初始化必须来自initialize -call之后的reset函数。 除非您将模型传递给您的收藏集,否则您将不会调用rest ,您乍一看似乎并没有这样做,但是实际上

var m = new Bar({});

骨干网将{}解释为模型,从而在reset函数中对其进行初始化。 但是{}不是您说的模型吗? 好吧,Backbone对此不太挑剔,它只需要一个可以包含或不包含模型属性的哈希数组。 reset功能最终导致add功能,最后所有道路都通向罗马,或者我应该说_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;
}

此处发生的情况是Collection会检查它是否已经传递了模型或属性哈希,在属性哈希的情况下,它只是基于其定义的模型创建新模型并将该哈希传递。

希望这不仅可以解决问题,而且可以进一步说明那里发生的事情。 当然,我会热情地鼓励所有人阅读骨干源代码, 这是最糟糕的文档OG

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM