我尝试传递一些参数来查看构造函数。
我正在以这种方式创建我的对象:new HeadCell({isSortable: true, parent: this});
所以在HeadCell初始化:
initialize: function(options){
console.log("HeadCell initialized");
console.log(options);
console.log(options.isSortable);
}
控制台输出是:
HeadCell初始化了 Object {isSortable:true,parent:r}
未捕获的TypeError:无法读取未定义的属性'isSortable'
有什么想法吗?
更新1
我尝试在小提琴中进行一点测试,结果是一样的。
http://jsfiddle.net/ramiromd90/hHFP3/
更新2
我在小提琴上试试你的例子,并且工作正常!但是,在我的代码中不起作用。
这里有一个关于我的真实代码的小例子的小提琴:
http://jsfiddle.net/ramiromd90/XCK47/
更新3
感谢所有回复,问题是我没有传递循环中的参数(参见小提琴)。传递我们说的参数的方法是正确的!感谢
答案 0 :(得分:4)
您的小提琴中的代码不正确,因为当您的options参数从未初始化为视图对象的一部分时,您正在调用this.options
。换句话说,您正在调用不存在的属性。
请改为尝试:
$(function(){
var Aview = Backbone.View.extend({
initialize: function(options){
console.log(options.foo);
console.log(options.bar);
}
});
new Aview({foo:'isFoo!',bar:'isBar!'});
});
现在,让我们更详细地了解当你将它作为参数传递给构造函数时,options参数实际发生了什么。
根据doc
有几个特殊选项,如果通过,将直接附加到视图:model,collection,el,id,className,tagName,attributes和events。
这是什么意思?那么,options参数实际上在视图构造函数中以两种方式使用。
首先,它使用此调用设置特殊选项
_.extend(this, _.pick(options, viewOptions));
返回一个只包含viewOptions
中特殊选项的新对象,然后将这些选项添加到视图对象中。
接下来,一旦添加了这些特殊选项,它就会调用initialize函数。
this.initialize.apply(this, arguments);
在这种情况下,它相当于调用
currentViewObject.initialize({anOptionsAttribute: 'hello'});
允许您作为参数或通过arguments
对象访问选项对象。正如您所看到的,在任何时候都没有将options参数设置为属性,因此调用this.options
只是荒谬的。
答案 1 :(得分:1)
View = Backbone.View.extend({
initialize: function(options){
console.log(options);
console.log(options.isSortable);
}
});
var view = new View({isSortable: true, parent: this });
我不明白为什么它不起作用。你仔细检查了拼写吗?
“this.options”已在主干1.1.0中删除 见:
http://backbonejs.org/#upgrading
在1.1中,Backbone Views不再自动附加options参数作为this.options。如果您愿意,请随意继续添加。