Наследование делегата

Я создал класс с Selectbox и некоторыми элементами списка. Чтобы изменить метку этих элементов, я установил делегат контроллера selectbox с помощью configureItem,

Знайте, я хочу добавить некоторые дочерние элементы этого класса и добавить некоторые элементы в список. Теперь я должен настроить configureItem вызывая функцию в configureItem. Эта функция проверяет, находится ли Item в текущем классе, а когда это не так, я вызываю метод суперкласса, который обрабатывает метку своего Item.

Это хорошо сработало в 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 ответ

Решение

Проблема в том, что компилятор поддерживает только this.base и вы дали псевдоним this как that и поэтому это не признается.

Я добавил это как проблему здесь ( https://github.com/qooxdoo/qooxdoo-compiler/issues/102), и эту конкретную проблему необходимо исправить, прежде чем мы выпустим 6.0.

Глядя на ваш код, исправление заключается в том, что this в that переменная не обязательна, поэтому измените код на this.base работает (спасибо, что попробовали это на Gitter qooxdoo!)

Однако, если вы не смогли просто перейти на использование this.baseобходной путь заключается в использовании явных вызовов методов, например, вместо that.base вы бы использовали что-то вроде

operatorDelegateItems : function(item, that) {
    if (item.getLabel() == "Period")
        item.setLabel("Jahresintervall");
    else
        myapp.MyBaseClass.prototype.operatorDelegateItems.call(this, item, that);
}
Другие вопросы по тегам