2016-03-16 5 views
0

Я хочу вызвать методы крюка onBeforeRendering и onAfterRendering внешне. Моим требованием является то, что когда мои 3/4 ajax звонки завершатся, я обрабатываю части пользовательского интерфейса после этого, мне нужно вызвать эти два метода.Как переопределить методы крюка SAPUI5

+1

Я думаю, что ваша архитектура неверна, если вы зависите от завершения вызовов AJAX для вызова перехватов событий onBeforeRendering'/'onAfterRendering' (потому что это то, что они есть, крючки событий, а не методы). Я бы предложил использовать вызовы AJAX promiss 'done()' и/или 'fail()' для дополнительного дополнительного рендеринга – Qualiture

+0

@ Qualiture- Спасибо. Мое требование - есть один экран, я загружаю данные с помощью ajax-вызова (он должен быть синхронным). Зависит от данных, которые мне нужны для отображения макета экрана. Я должен использовать обетонные объекты. При успехе ajax мне нужно построить экран. Я регистрирую события в ** onAfterRendering **. Поэтому после отображения экрана мне нужно вызвать onAfterRendering. – MH09

+1

Почему бы не зарегистрировать свои события в вызовах AJAX 'done()' (или 'always()') и отобразить дополнительные элементы экрана? И почему ваши вызовы AJAX синхронны? Побочным эффектом этого является то, что ваш экран остается пустым, и ваш пользователь ждет загрузки экрана, вместо того, чтобы, по крайней мере, сделать что-то заранее, и отобразить дополнительные элементы экрана после успешного вызова ajax? – Qualiture

ответ

0

Как @Qualiture сказал в комментарии, вы не можете назвать эти методы, поскольку они являются крючками, вызывается каркасом до и после рендеринга элемента управления.

Вы, однако, может «попросить» для отрисовки элемента управления, который, в свою очередь, будет вызывать как крюки, позвонив по телефону или oControl.rerender()oControl.invalidate()

1

Как уже говорилось, я думаю, что ваша архитектура не так. Я бы построить что-то вроде этого:

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 звонки все успешно завершено)
0

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

т. Е. Если для элемента управления требуется некоторый объект «данных», привяжите элемент управления к образцу/данным модели, который будет обновлен вашим вызовом ajax и управляет видимым атрибутом элемента управления с чем-то вроде {= $ {/ data} || false}

Фактически это как-то полагается на структуру, чтобы вызвать функцию рендеринга элемента управления, когда он обнаруживает изменение в модели.