Как передать значение свойства в метод init в SAPUI5?

1

Представьте, что у меня есть класс

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 он работает, поэтому, что здесь не так и как я могу достичь своей цели?

Теги:
sapui5

1 ответ

2
Лучший ответ

Ваша проблема вызвана кодом здесь в конструкторе ManagedObject. Этот класс является суперклассом любого элемента управления (ManagedObject <- Element <- Control). Если вы посмотрите на код, вы заметите следующие шаги:

  • Создается пустой пакет свойств (фактически с вашими значениями по умолчанию).
  • init метод init.
  • mSettings свойств mSettings применяется к вашему контролю. Этот пакет свойств - тот, который вы (или синтаксический анализатор XML) передаете в конструкторе элементов управления.

Это разработанное поведение для UI5. Поскольку функция init должна приводить элемент управления в инициализированное состояние, и только после этого свойства (переданные конструктору) будут применены к вашему элементу управления. Это гарантирует, что все настройки, которые вы переопределили, всегда вызываются после инициализации элемента управления (ну, по крайней мере, за исключением ситуации, когда вы вызываете их внутри кода инициализации).

Чтобы обойти это, у вас есть два варианта, о которых я могу думать:

  • Используйте трюк с задержкой вызова 0 (см. Раздел "Что такое setTimeout, когда установлено значение 0 миллисекунд?" Для пояснений). В основном вы можете сделать: 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-й параметр).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню