Как переопределить / отключить «escapeHandler» «Диалога» через XML-шаблон в UI5?

#sapui5

#sapui5

Вопрос:

Я знаю, как переопределить в UI5 поведение по умолчанию sap.m.Dialog escapeHandler через контроллер, например:

 this._oDialog.setEscapeHandler((oEscapeHandler) => {
    oEscapeHandler.reject();
});
  

Вопрос, возможно ли обеспечить альтернативное escapeHandler поведение с помощью XML-шаблона без использования setEscapeHandler ?

В идеале это должно быть что-то вроде escapeHandler = "none/customFunction" , например:

 <Dialog
    id = "authDialog"
    title = "{i18n>DIALOG_TITLE}"
    type = "Message"
    escapeHandler = "%CUSTOM_ESCAPE_HANDLER%">
</Dialog>
  

В частности, я хочу отключить Dialog закрытие при Escнажатии кнопки и сделать это элегантным, декларативным способом с помощью XML-шаблона, например escapeHandler = "none" .

Комментарии:

1. Соответствующий запрос на улучшение: github.com/SAP/openui5/issues/1411

2. Дайте 👍 проблеме, чтобы сопровождающие знали, что исправление помогает и другим разработчикам 🙂

3. Также в github.com/SAP/openui5/issues/1908 что является более общим запросом на исправление оставшихся свойств, которые ожидают функции, но все еще "any"

Ответ №1:

Появилась новая фиксация (объединенная сегодня), которая позволяет назначать функции контроллера escapeHandler . Благодаря этому теперь возможен приведенный ниже код:

 <Dialog xmlns="sap.m"
  id="authDialog"
  title="{i18n>DIALOG_TITLE}"
  type="Message"
  escapeHandler=".handleEscape"
>
  
 handleEscape: function(pEscapePending) {
  // Depending on the use case, call pEscapePending.resolve() or pEscapePending.reject() to overwrite the default behavior.
},
  

Исправление должно быть доступно с выпуском 1.86.

Комментарии:

1. Санта приходит в эти годы даже раньше, чем обычно!

2. Я протестировал его на 1.86, все работает отлично!

3. @MikeB. Я только что переименован onEsc в handleEscape . ** on ** Something является закрытым по умолчанию (не только по соглашению, но и по API). И escapeHandler ЭТО НЕ событие, а свойство, которое ожидает выполнения функции. Мы не можем передать туда параметры .

4. @MikeB. Сам параметр не является обещанием, а является оболочкой вокруг внутреннего обещания, которое обрабатывает escape (src) . С другой стороны, в документе также упоминается «Это свойство ожидает функцию с одним параметром типа Promise . В функции вы должны вызвать либо resolve() или reject() для объекта Promise … Давайте просто притворимся, что это обещание 🙂

5.@MikeB. Вы можете назвать обработчик так, как хотите. Однако методы, начинающиеся с on , по умолчанию являются частными в контексте UI5 («если имя свойства не начинается с подчеркивания или с префикса «on», имя свойства будет автоматически добавлено в список общедоступных методов» (src)) и обычно зарезервировано для обработчиков событий. Поскольку escapeHandler это не событие и поскольку обработчик может также использоваться другими классами, обработчик не on должен начинаться с.

Ответ №2:

Я решил эту проблему, указав свойство escapeHandler = "customFunction" , а затем создав функцию без реализации в контроллере. В основном у customFunction меня был комментарий, объясняющий, что это используется для переопределения поведения escape по умолчанию.

Комментарии:

1. Я попробовал ваш подход, добавив escapeHandler = "customFunction" к Dialog тегу внутри Dialog XML-фрагмента, но это не сработало. Не могли бы вы, пожалуйста, поделиться каким-нибудь фрагментом кода, возможно, я пропустил что-то незначительное, но все же важное.

2. Я проверил код, так как я написал это некоторое время назад, и я использовал setEscapeHandler перед открытием диалога, так что это в основном то же самое, что и вы. Ваше решение кажется немного лучше, у меня также был пустой метод вместо использования oEscapeHandler.reject() . Извините, что ввел вас в заблуждение, мне также было нелегко найти решение, и кажется, что использование escapeHandler=»customFunction» не сработает.