代表的继承

时间:2018-01-22 10:20:43

标签: inheritance qooxdoo

我创建了一个带有Selectbox和一些Listitems的类。要更改这些项目的标签,我将selectbox控制器的委托设置为configureItem

知道我想添加这些类的一些子元素并将一些项添加到列表中。现在我必须通过调用configureItem中的函数来调整configureItem。这个函数检查Item是否在当前类中,当它不是我调用处理其Items标签的超类方法时。

这很好用的是Qooxdoo 5.0.2。现在我更改为Qooxdoo 6以使用新编译器,并在调用超类方法时得到错误:Uncaught TypeError: 'caller', 'callee', and 'arguments' properties may not be accessed on strict mode functions or the arguments objects for calls to them

以下是一些代码段:

//Set Delegate in superclass
this.operatorController.setDelegate({
    configureItem : function(item) {
        that.operatorDelegateItems(item, that);
    }
});

// Superclass Method
operatorDelegateItems : function(item, that) {
        switch (item.getLabel()) {
        case "":
            item.setLabel(qx.locale.Manager.tr("Ist Vorhanden"));
            break;
        case "-":
            item.setLabel(qx.locale.Manager.tr("Ist nicht Vorhanden"));
            break;
        case "Nachfolger":
            item.setLabel(qx.locale.Manager.tr("Zeige Nachfolger"));
            break;
        }
    }

// Child class Delegate FUnction
operatorDelegateItems : function(item, that) {
    if (item.getLabel() == "Period")
        item.setLabel("Jahresintervall");
    else
        that.base(arguments, item);
}

有人可以帮我解决这个问题,还是有更好的方法来解决我的问题?

1 个答案:

答案 0 :(得分:1)

问题是编译器只支持this.base并且您将this别名为that,因此无法识别。

我已将此问题添加为此处(https://github.com/qooxdoo/qooxdoo-compiler/issues/102),并且在我们发布6.0之前需要修复该特定问题。

查看您的代码,修复是在this变量中携带that是不必要的,因此将代码更改为this.base有效(感谢您试用{ {3}}!)

但是,如果您无法更改为使用this.base,那么解决方法是使用显式方法调用,例如,而不是that.base,您可以使用类似

的内容
operatorDelegateItems : function(item, that) {
    if (item.getLabel() == "Period")
        item.setLabel("Jahresintervall");
    else
        myapp.MyBaseClass.prototype.operatorDelegateItems.call(this, item, that);
}