Наследование делегата
Я создал класс с 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);
}