Backbone.js 在主干木偶节点中扩展ItemView时出现意外行为
我有这样的想法:Backbone.js 在主干木偶节点中扩展ItemView时出现意外行为,backbone.js,marionette,Backbone.js,Marionette,我有这样的想法: MyView = Backbone.Marionette.ItemView.extend({ templateHelpers: function () { return { imageName: function () { var img = this.name.toLowerCase().replace(" ", "_"); return img; } } }, myFunc:
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扩展。您需要显式调用正在扩展的对象原型的初始化函数。继承不会像您在其他语言中熟悉的那样自动发生 因此,在
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
templatehelper,它扩展了继承的templateHelpers返回对象。如果派生视图只调用base(super)objects函数就好了,但它不是这样工作的。这种方法虽然不是您所期望的,但确实允许您从继承的视图继承辅助对象,并将其添加到派生视图中。对于您自己添加到视图中的大多数函数,您不需要这样做。但是,也有一些内置的视图函数案例,例如,initialize
,events
等,您需要以这种方式进行管理。谢谢。我明白逻辑。但这并不能解决问题。在MySecondView中调用initialize函数,但在“父”中运行initialise之前发生错误(找不到templateHelper)。初始化从未在父级中触发。啊,我看到这是一个特殊情况,因为木偶视图的工作方式。我将更新我的答案。在MySecondView中调用templateHelpers时,MyView的原型上不存在templateHelpers。(再说一次;还没有在MyView上调用initialize?)。。。我是否需要在MyView中执行一些操作,以便将templateHelpers放在其上—就像我的自定义函数一样?