2016-08-02 4 views
0

Общий ОшибкаHandler, который является расширением и подключен к запросу основной модели каждого компонента, полезна для неожиданных ошибок. Однако, когда я создаю новые сущности, я хочу сообщать о дружеских сообщениях. Эти сообщения формируются в шлюзе и передаются в предложении RAISE. В настоящее время это вызывает отдельные окна сообщений для всплывающего окна, одно из ErrorHandler, одно из моего onErrorHanlder, которое я передаю в oModel.create().Придерживайтесь общей ошибки ErrorHandler.js, позволяя настраивать обработку ошибок по запросу и не иметь двойных ящиков сообщений

Как я могу сохранить общий, но не использовать его в этом случае?

+0

Можете ли вы показать код? Возможно, вы можете попытаться остановить распространение событий в обработчике ошибок, используя https://sapui5.hana.ondemand.com/docs/api/symbols/sap.ui.base.Event.html#cancelBubble или https: // sapui5 .hana.ondemand.com/документы/апи/символы/sap.ui.base.Event.html # preventDefault – cschuff

ответ

1

Чтобы отсоединить обработчик ошибок (временно) от вашей модели, вам нужно будет позвонить обработчику detachRequestFailed, который прилагается к вашей модели. Этот обработчик прикреплен к вашей модели в constructorErrorHandler.

Однако, чтобы отсоединить этот обработчик, вам нужен слушатель и функция. Функция обработчика является анонимной функцией, хотя вы не можете легко ссылаться, когда вы хотите временно удалить обработчик.

В настоящее время доставляется ErrorHandler показывает только первое сообщение об ошибке. Он делает это, проверяя, открыт ли ящик сообщений и показывается только окно сообщения, когда окно сообщения еще не открыто. Чтобы подавить все окна сообщений, просто сделайте ErrorHandler уверенным, что есть окно сообщения уже открыто: this.component._oErrorHandler._bMessageOpen = true;. И как только вы закончите со специальной службой и пользовательскими обработчиками и захотите вернуться к умолчанию ErrorHandler, просто убедитесь, что ErrorHandler считает, что окна сообщений больше не открыты: this.component._oErrorHandler._bMessageOpen = false;

Вероятно, лучшей альтернативой является запись ваш собственный ErrorHandler и убедитесь, что функция обработки ошибки не является анонимной. Таким образом, вы можете легко отсоединить и снова подключить функцию к вашей модели.

Необходимое изменение ErrorHandler.js: изменить constructor и добавьте _metadataFailedHandler и _requestFailedHandler

constructor : function (oComponent) { 
    this._oResourceBundle = oComponent.getModel("i18n").getResourceBundle(); 
    this._oComponent = oComponent; 
    this._oModel = oComponent.getModel(); 
    this._bMessageOpen = false; 
    this._sErrorText = this._oResourceBundle.getText("errorText"); 
    this._oModel.attachMetadataFailed(this._metadataFailedHandler, this); 
    this._oModel.attachRequestFailed(this._requestFailedHandler, this); 
}, 

_metadataFailedHandler: function(oEvent) { 
    var oParams = oEvent.getParameters(); 
    this._showMetadataError(oParams.response); 
}, 

_requestFailedHandler: function(oEvent) { 
    var oParams = oEvent.getParameters(); 

    // An entity that was not found in the service is also throwing a 404 error in oData. 
    // We already cover this case with a notFound target so we skip it here. 
    // A request that cannot be sent to the server is a technical error that we have to handle though 
    if (oParams.response.statusCode !== "404" || (oParams.response.statusCode === 404 && oParams.response.responseText.indexOf("Cannot POST") === 0)) { 
     this._showServiceError(oParams.response); 
    } 
}, 

Для отсоединения ErrorHandler:

this.getModel().detachRequestFailed(
    this.component._oErrorHandler._requestFailedHandler, 
    this.component._oErrorHandler); 

И вновь присоединить ErrorHandler после того как вы сделали с пользовательский запрос и пользовательский обработчик:

this.getModel().attachRequestFailed(
    this.component._oErrorHandler._requestFailedHandler, 
    this.component._oErrorHandler); 
0

Чтобы добавить к вышеуказанному ответу от jpenninkhof, у меня есть сценарий, в котором возникают события с запросом. (Возможно, событие застряло в очереди событий) даже после того, как запрос oViewModel.update (в моем случае это запрос на обновление) был завершен. Поэтому у меня есть решение для этого. Позвольте мне сначала объяснить проблему. У меня есть диалоговое окно для редактирования заказа на продажу с помощью кнопки «Сохранить/Отменить». В «Сохранить» oViewModel.update вызывается с функциями «Успех» и «Обработчик ошибок».

this.getOwnerComponent().getModel().detachRequestFailed(this.getOwnerComponent()._oErrorHandler._requestFailedHandler,this.getOwnerComponent()._oErrorHandler); 
oViewModel.update(aObjectPath, aData, { 
success: function(oData, oResponse) { 
    MessageToast.show("Request created successfully"); 
    this.getOwnerComponent().getModel().attachRequestFailed(this.getOwnerComponent()._oErrorHandler._requestFailedHandler, this.getOwnerComponent()._oErrorHandler); 
}, 
error: function(oData, oResponse) { 
    MessageToast.show("Error updating Sales Order."); 
    this.getOwnerComponent().getModel().attachRequestFailed(this.getOwnerComponent()._oErrorHandler._requestFailedHandler, this.getOwnerComponent()._oErrorHandler); 
    }}); 

ErrorHandler -> _ requestFailedHandler вызывается после функции ошибки, таким образом, по-прежнему появляется родовое всплывающее окно об ошибке. Я попробовал ErrorHandler -> attachRequestFailed() в oViewModel.attachRequestCompleted(), но обработчик requestFailed все еще вызывался после завершения запроса oData (возможно, это ошибка/ограничение).

Так что я создал еще один флаг в ErrorHandler.js вместе с функцией обратного вызова. Флаг предотвращает всплывающее всплывающее сообщение службы (например, ErrorHandler -> _ bMessageOpen) и вызывает обратный вызов, чтобы вызывающий абонент знал, что был вызван _showServiceError().

_showServiceError: function(sDetails) { 

     if (this._bServiceErrorOpen){ 
      this._fnCallback(); 
      return; 
     } 

     if (this._bMessageOpen) { 
      return; 
     }..... 
} 

Определим еще 2 функции, один, чтобы установить функцию обратного вызова флаг & и другие, чтобы сбросить его.

setServiceErrorFlag: function(fnCallback){ 
     this._bServiceErrorOpen = true; 
     this._fnCallback = fnCallback; 
    }, 

    resetServiceErrorFlag: function(){ 

     this._bServiceErrorOpen = false; 
     this._fnCallback = undefined; 
    } 

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

var that = this; 
this._bErrorResponse = false; 
this.getOwnerComponent()._oErrorHandler.setServiceErrorFlag(function() 
{ 
    while (that._bErrorResponse === false){} 
    that.getOwnerComponent()._oErrorHandler.resetServiceErrorFlag(); 
}); 

В обработчик ошибок oViewModel.update(), установить _bErrorResponse истину, так что в то время как цикл получает вышел и флаг ErrorHandler сбрасывается. Это делается для того, чтобы флаг ErrorHandler был сброшен только после вызова Error callback.

error: function(oData, oResponse) { 
    MessageToast.show("Error updating Sales Order."); 
    that._bErrorResponse = true; 
} 

Таким образом, сообщение ServiceError подавляется, и вместо этого вы можете дать собственное сообщение об ошибке в функции обратного вызова ошибки oViewModel CRUD API.