我正在使用Backbone.js应用程序,该应用程序使用所有视图和子视图扩展的“主视图”。
主视图
define(['backbone'], function (Backbone) {
return Backbone.View.extend({
events: {
},
showSuccess: function (msg) {
alert(msg);
}
});
});
然后我有一个生成页面的主视图,这可以调用较小部分的子视图:
define(['backbone','masterView', 'mySubView'], function (Backbone, mView, mySubView) {
var mainView = mView.extend({
events: function () {
return _.extend({}, coreView.prototype.events, {
});
},
render: function () {
var sub = new mySubView({'foo': 'bar'});
}
});
return new mainView();
});
最后,我的子视图,在初始化时,它表示options
未定义。
define(['backbone','masterView', 'mySubView'], function (Backbone, mView, mySubView) {
var subView = mView.extend({
events: function () {
return _.extend({}, coreView.prototype.events, {
});
},
initialize: function (options) {
console.log(options);
}
});
return new subView();
});
在此设置中,为什么options
在MainView
传递时未定义?如果子视图不扩展masterView
,而是扩展Backbone.view
,则可以正常工作。
答案 0 :(得分:4)
子视图文件中的最后一行:
return new subView();
您正在返回一个新实例,而不是在子视图模块中返回构造函数。它应该是:
return subView;
请注意,as a convention, JavaScript代码应使用 PascalCase 作为类型(构造函数,类等),而实例(变量,属性等)应使用 camelCase 强>
另外,我在how to design a good base class with Backbone上分享了一些技巧。您可以将合并事件的职责转移到基类而不是每个子类。