Backbone.js bug?
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控制台中,我会得到"你好!"。当我评论这句话时:
model: Foo,
没有"你好!"在控制台输出中。因此,为集合声明一个模型会调用该模型的initialize
函数。我觉得这种行为有点傻。我还没有通读主干网的代码,但这有什么原因吗?
好吧,代码的行为没有错
在集合定义中传递模型时,指定该集合中的每个模型的类型为Foo
当您初始化集合new Bar({})
时,您将一个模型传递给集合(尽管正如@alexanderb所说,我认为集合需要一个数组作为第一个参数),然后它对其进行初始化,从而输出'hello!'
例如,如果您没有将任何模型传递给集合构造函数:
new Bar();// no console output
没有控制台输出,另一方面,如果您传递一个对象数组,那么集合将初始化所有提供的模型:
new Bar([{},[},{}]);// will output 'hello!' 3 times
我相信集合的构造函数正在期待模型的数组。所以,你应该做的是:
var collection = new Bar( [ {} ] );
在那里,应该调用模型的initialize方法。
经过一番调查,我发现了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});
};
因此,如果你为你的收藏创建一个初始化方法,比如这个
initialize: function() {
console.log('hello collection!');
}
您会注意到hello集合记录在hello-from模型之前。因此,模型初始化必须来自initialize
-调用之后的reset
函数。rest
不会被调用,除非你有模型传递到你的收藏中,你一眼望去似乎并没有这样做,但实际上是在中
var m = new Bar({});
Backbone将{}
解释为一个模型,从而在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。
- “*[attribute ^="string”是如何/为什么是有效的querySelector?(JS bug
- Backbone.js bug?
- Android的Bug:调试修复JS
- JS DataTables ColReorder API Reorder Bug?
- FF中的JS Fine,Chrome中的bug
- 需要建议和bug帮助!(HTML和JS,可能是PHP和MySQL)
- Safari上的JS Bug:意外的令牌'='
- Three.js - bug with shadows
- PHP中生成HTML的JS bug
- React Native packager.js bug导致开发服务器崩溃
- js中的单节点bug
- 用Moment JS解析序数时令人困惑的行为.Bug
- JS function with bug
- Node.js重载模块bug
- Js的angular bug只在Safari上出现
- EXT JS 4.0.2a >网格过滤器>UI bug
- 在Rails 4.1中将bug coffeescript渲染为js
- Angular.js bug with safari?
- Java和JS/AS3在URL解码/编码UTF-8方面的差异(bug!?)
- HERE 映射 JS API v3: 'onceEventListener' 方法 bug