首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Backbone.js错误?

Backbone.js错误?
EN

Stack Overflow用户
提问于 2012-07-26 14:53:20
回答 3查看 247关注 0票数 0

我在test.html中有以下内容:

代码语言:javascript
复制
<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!‘。当我注释掉这行时:

代码语言:javascript
复制
model: Foo,

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-07-26 15:03:45

好吧,代码的行为没有任何问题。

当您在集合定义中传递模型时,您指定该集合中的每个模型都将是Foo类型。

当您初始化集合new Bar({})时,您将一个模型传递给集合(尽管,正如@alexanderb所述,我认为集合需要一个数组作为第一个参数),它会对其进行初始化,从而输出'hello!'

例如,如果您没有将任何模型传递给集合构造函数:

代码语言:javascript
复制
new Bar();// no console output

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

代码语言:javascript
复制
new Bar([{},[},{}]);// will output 'hello!' 3 times
票数 3
EN

Stack Overflow用户

发布于 2012-07-26 15:05:57

我相信集合的构造器期望模型的数组。所以,你应该做的是:

代码语言:javascript
复制
var collection = new Bar( [ {} ] );

在这里,应该调用model的初始化方法。

票数 1
EN

Stack Overflow用户

发布于 2012-07-26 15:33:19

经过一些调查,我发现Backbone.Collection函数如下所示:

代码语言:javascript
复制
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创建一个初始化方法,如下所示

代码语言:javascript
复制
initialize: function() {
  console.log('hello collection!');   
}

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

代码语言:javascript
复制
var m = new Bar({});

Backbone将{}解释为模型,从而在Backbone-function中对其进行初始化。但是你说{}不是一个模型吗?Backbone对此并不太挑剔,它只需要一个可以包含也可以不包含模型属性的散列数组。reset-function最终通向add-function,最后所有的道路都通向罗马,或者我应该说_prepareModel-function

代码语言:javascript
复制
_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检查是否已经向它传递了模型或属性的散列,在属性散列的情况下,它只是基于其定义的模型创建一个新模型,并传递该散列。

希望这不仅解决了问题,而且对那里发生的事情提供了一些额外的了解。当然,我也热情地鼓励大家去阅读主干源代码-- the baddest OG of documentation

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11663961

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档