1

我有这样的事情:

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

4

1 回答 1

3

您需要显式调用要扩展的对象原型的初始化函数。继承不会像您在其他语言中熟悉的那样自动发生

因此,在MySecondView对象的初始化函数中,您需要插入以下行:

MyView.prototype.initialize.call(this);

更新

因为 Marionette templateHelpers(当它是一个函数时)在实例化时由视图自动调用,所以您需要将所有返回值合并到原型链中。Marionette 不会自动执行此操作。所以在你的情况下,你会想要做这样的事情MySecondView

MySecondView = MyView.extend({

    myFunc: function() {//something}

    templateHelpers: function () {
        return  _.extend({ localHelper: function() { 
                                              // something interesting
                             }}, MyView.prototype.templateHelpers.call(this));

    },

})

localHelper在派生视图中添加了一个模板助手,它扩展了继承的 templateHelpers 返回对象作为示例。如果派生视图只调用基本(超级)对象函数会很好,但它不会那样工作。这种方法虽然不是您所期望的,但确实允许您从继承的视图中继承助手并在派生视图中添加它们。对于您自己添加到视图中的大多数功能,您不需要这样做。但是,您需要以这种方式管理诸如此类的内置视图功能initialize案例events

于 2013-07-12T13:07:23.273 回答