我有这样的事情:
MyView = Backbone.Marionette.ItemView.extend({
templateHelpers: function () {
return {
imageName: function () {
var img = this.name.toLowerCase().replace(" ", "_");
return img;
}
}
},
myFunc: function() {//something}
//lots of other stuff
})
MySecondView = MyView.extend({
myFunc: function() {//something}
})
这样做的动机是我想在第二次使用ItemView时覆盖函数myFunc,但是否则它是相同的。
我发现的问题是我必须在MySecondView中重新声明templateHelpers属性 - 否则我得到一个关于未定义的imageName()的错误。我没想到这个。如果我'延伸'它肯定应该在那里。但是,那么,我不确定这里有什么'延伸'。我不认为这是jQuery扩展。
答案 0 :(得分:3)
您需要显式调用正在扩展的对象原型的初始化函数。继承不会像您熟悉的其他语言一样自动发生
因此,在MySecondView
对象的初始化函数中,您需要插入一行:
MyView.prototype.initialize.call(this);
<强>更新强>
因为当实例化视图时,视图会自动调用木偶templateHelpers
(当它是一个函数时),你需要将所有返回值合并到原型链中。木偶不会自动执行此操作。因此,在您的情况下,您需要在MySecondView
中执行类似的操作:
MySecondView = MyView.extend({
myFunc: function() {//something}
templateHelpers: function () {
return _.extend({ localHelper: function() {
// something interesting
}}, MyView.prototype.templateHelpers.call(this));
},
})
我在派生视图中添加了一个localHelper
模板助手,它扩展了继承的templateHelpers返回对象作为示例。如果派生视图只调用基(超)对象函数会很好,但它不会那样工作。这种方法虽然不是您所期望的,但允许您从继承的视图继承帮助程序并在派生视图中添加它们。对于您自己添加到视图中的大多数功能,您无需执行此操作。但是,有一个内置的视图函数案例,例如initialize
,events
等,您需要以这种方式进行管理。