Представьте, что у меня есть класс
sap.ui.core.Control.extend("sap.my.MyButton", {
metadata: {
properties: {
"isButtonWithMenu": {
type: "boolean",
defaultValue: true
}
}
}
},
init: function () {
if (this.getIsButtonWithMenu()) {
this.myButton = this._createMenuButton();
} else {
this.myButton = this._createNormalButton();
}
var baseBox = new sap.m.FlexBox();
baseBox.addItem(this.myButton);
this.setLayout(baseBox);
}
Теперь я хочу передать значение для isButtonWithMenu
в мой метод init
и я делаю следующее:
var myButton = new sap.my.MyButton({isButtonWithMenu: false});
но это не работает, что означает, что я не получаю переданное значение внутри класса. Однако, когда я изменяю defaultValue
он работает, поэтому, что здесь не так и как я могу достичь своей цели?
Ваша проблема вызвана кодом здесь в конструкторе ManagedObject. Этот класс является суперклассом любого элемента управления (ManagedObject <- Element <- Control). Если вы посмотрите на код, вы заметите следующие шаги:
init
метод init
.mSettings
свойств mSettings
применяется к вашему контролю. Этот пакет свойств - тот, который вы (или синтаксический анализатор XML) передаете в конструкторе элементов управления. Это разработанное поведение для UI5. Поскольку функция init
должна приводить элемент управления в инициализированное состояние, и только после этого свойства (переданные конструктору) будут применены к вашему элементу управления. Это гарантирует, что все настройки, которые вы переопределили, всегда вызываются после инициализации элемента управления (ну, по крайней мере, за исключением ситуации, когда вы вызываете их внутри кода инициализации).
Чтобы обойти это, у вас есть два варианта, о которых я могу думать:
jQuery.sap.delayedCall(0, this, function() { this.myButton =... })
чтобы убедиться, что настройки уже применены к вашему jQuery.sap.delayedCall(0, this, function() { this.myButton =... })
управления.constructor
для вашего контроля. Что-то вроде: sap.ui.core.Control.extend("sap.my.MyButton", {
metadata: { /* same as before */},
constructor: function () {
sap.ui.core.Control.apply(this, arguments);
// the init function was already called by this point
// also the settings should have been applied
if (this.getIsButtonWithMenu()) {
this.myButton = this._createMenuButton();
} else {
this.myButton = this._createNormalButton();
}
var baseBox = new sap.m.FlexBox();
baseBox.addItem(this.myButton);
this.setLayout(baseBox);
}
})
Вы также можете поместить свой код перед вызовом супер-конструктора (не совсем правильно с точки зрения ООП), но тогда вы не можете использовать getter и должны искать внутри параметра конструктора mSettings
(2-й параметр).