Использование либо инъекции зависимостей , либо ленивая инициализация всегда предпочтительнее, как уже было подробно объяснено в других ответах.
Когда вы не хотите или не могут использовать эти шаблоны и для примитивных типов данных, есть три веские причины, по которым я могу подумать, почему предпочтительнее инициализировать атрибуты класса вне конструктора:
Глядя на код SAP в GitHub в InputBase.js
, новое значение уже записывается в свойство при запуске события, к которому вы присоединяетесь. Моим предложением было бы сохранить выбранное значение в переменной класса внутри вашего контроллера и вернуться к этому значению, как только пользователь отменит его для достижения вашей цели.
подход правильный (диалог внутри onChange
), но вам нужно внести некоторые изменения. Когда SAPUI5 вызывает метод onChange, значение уже записывается внутри вашего элемента управления, поэтому oEvent.stopPropagation();
вообще ничего не делает.
Что вы можете сделать, это использовать метод ComboBox
setSelectedItem(null)
, который должен сбросить текущий выбор (отменяя выбор пользователя).
ОБНОВЛЕНИЕ: Я обновил код, чтобы удовлетворить ваш запрос.
__selectedItem: null,
onChange: function (oEvent) {
var that = this;
var source = oEvent.getSource();
var selectedItem = oEvent.getSource().getSelectedItem();
MessageBox.show("Are you sure you want to do that?", {
icon: MessageBox.Icon.Information,
title: "Info",
actions: [MessageBox.Action.YES, MessageBox.Action.NO],
defaultAction: MessageBox.Action.NO,
onClose: function (sButton) {
if (sButton === MessageBox.Action.YES) {
//execute my logic in here => that works
that.__selectedItem = selectedItem;
} else {
source.setSelectedItem( that.__selectedItem );
}
}
});
}