在Backbone Marionette中扩展ItemView时出现意外行为

时间:2013-07-12 12:53:37

标签: backbone.js marionette

我有这样的事情:

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扩展。

1 个答案:

答案 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返回对象作为示例。如果派生视图只调用基(超)对象函数会很好,但它不会那样工作。这种方法虽然不是您所期望的,但允许您从继承的视图继承帮助程序并在派生视图中添加它们。对于您自己添加到视图中的大多数功能,您无需执行此操作。但是,有一个内置的视图函数案例,例如initializeevents等,您需要以这种方式进行管理。