Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Backbone.js 在主干木偶节点中扩展ItemView时出现意外行为_Backbone.js_Marionette - Fatal编程技术网

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放在其上—就像我的自定义函数一样?