Я хочу вызвать методы крюка onBeforeRendering и onAfterRendering внешне. Моим требованием является то, что когда мои 3/4 ajax звонки завершатся, я обрабатываю части пользовательского интерфейса после этого, мне нужно вызвать эти два метода.Как переопределить методы крюка SAPUI5
ответ
Как @Qualiture сказал в комментарии, вы не можете назвать эти методы, поскольку они являются крючками, вызывается каркасом до и после рендеринга элемента управления.
Вы, однако, может «попросить» для отрисовки элемента управления, который, в свою очередь, будет вызывать как крюки, позвонив по телефону или oControl.rerender()
oControl.invalidate()
Как уже говорилось, я думаю, что ваша архитектура не так. Я бы построить что-то вроде этого:
var self = this;
$.ajax(firstURL, {
method: "GET",
contentType: "application/json",
}).fail(function(response) {
// handle error
}).done(function(data) {
// do something with the returned data from first call
$.ajax(secondURL, {
method: "GET",
contentType: "application/json",
}).fail(function(response) {
// handle error
}).done(function(data) {
// do something with the returned data from second call
$.ajax(thirdURL, {
method: "GET",
contentType: "application/json",
}).fail(function(response) {
// handle error
}).done(function(data) {
// build extra UI elements, for example:
var someContainer = self.getView().byId("myContainer"); // ui element where you add more controls
someContainer.addContent(new com.initrode.MyCustomControl({
value : data.someProperty,
change : self.doSomething
}));
});
});
});
Как вы видите:
- Нет звонков в
onBeforeRendering/AfterRendering
- AJAX вызовы вложенные, все же асинхронное (Обещания решают «синхронный» вопрос здесь)
- Установите свои пользовательские обработчики событий управления (в данном случае
change
), поэтому дополнительной необходимости не требуется регистрация событий - Нет необходимости устанавливать какие-либо c ID ontrol (для элемента макета, за исключением, когда вам нужно добавить дополнительные элементы управления, необходимые после того как ваши Ajax звонки все успешно завершено)
Я не знаю, если вы можете сделать это для сценария, но в такой же ситуации, когда мне удалось переключиться на рендеринг (как только все вызовы ajax, необходимые для элемента управления, будут завершены, управление будет показано), используя привязку модели в приложении.
т. Е. Если для элемента управления требуется некоторый объект «данных», привяжите элемент управления к образцу/данным модели, который будет обновлен вашим вызовом ajax и управляет видимым атрибутом элемента управления с чем-то вроде {= $ {/ data} || false}
Фактически это как-то полагается на структуру, чтобы вызвать функцию рендеринга элемента управления, когда он обнаруживает изменение в модели.
Я думаю, что ваша архитектура неверна, если вы зависите от завершения вызовов AJAX для вызова перехватов событий onBeforeRendering'/'onAfterRendering' (потому что это то, что они есть, крючки событий, а не методы). Я бы предложил использовать вызовы AJAX promiss 'done()' и/или 'fail()' для дополнительного дополнительного рендеринга – Qualiture
@ Qualiture- Спасибо. Мое требование - есть один экран, я загружаю данные с помощью ajax-вызова (он должен быть синхронным). Зависит от данных, которые мне нужны для отображения макета экрана. Я должен использовать обетонные объекты. При успехе ajax мне нужно построить экран. Я регистрирую события в ** onAfterRendering **. Поэтому после отображения экрана мне нужно вызвать onAfterRendering. – MH09
Почему бы не зарегистрировать свои события в вызовах AJAX 'done()' (или 'always()') и отобразить дополнительные элементы экрана? И почему ваши вызовы AJAX синхронны? Побочным эффектом этого является то, что ваш экран остается пустым, и ваш пользователь ждет загрузки экрана, вместо того, чтобы, по крайней мере, сделать что-то заранее, и отобразить дополнительные элементы экрана после успешного вызова ajax? – Qualiture