Search code examples
angularjsserviceangular-ui-routerangular-ui

Error handling when data is not resolved in Angular UI router


I am using angular-ui-router's resolve to get data from server before moving a state. I want to inform user if the request has failed. I have service that will response error the request has failed. My question is how can I detect the failure in ui-router resolve and trigger some Modal service like pop up.

I have read some related posts online, but I am still confused how to make it happen. Thanks in advanced!

Config and Service:

angular.module('myApp',['ui.router', 'ngAnimate', 'ui.bootstrap'])
  .config(function ($stateProvider, $locationProvider) {  
      $locationProvider.html5Mode(true);
      $stateProvider
          .state('customer', {
              url: '/customer',
              templateUrl: '/customer.html',
              controller: 'CustomerCtrl',
              resolve: {
                  /* 
                   * How to inject CustomerService here
                   * How to catch the server error
                   * How to trigger a popup
                   */
                  data: cusomter_data
              }
           });

  })
  .service('CustomerService', function($http, $q) {
      return ({
          getGeneral: getGeneral
      });

      function getGeneral(customer_id) {
          var request = $http({
              method: "get",
                  url: '/customer',
                  params: {
                      customer_id: customer_id
                  }
          });
          return (request.then( handleSuccess, handleError));
      }

      function handleError (response){
          if (!angular.isObject(response.data) || !response.data.message) {
              return($q.reject("Failed to retrieve customer information."));
          } 
          return($q.reject(response.data.message));
      }

      function handleSuccess(response) {
          return (response.data);
      }
  });

Solution

  • After some research, I found out a solution by creating a errorModal service and inject it to resolve. Here is my solution.

    $stateProvider
        .state('customer', {
            url: '/customer',
            templateUrl: '/customer.html',
            controller: 'CustomerCtrl',
            resolve: {
                data: function(CustomerService, SelectedCustomerService, errorModalService) {
                    var shared = SelectedCustomerService;
                    return CustomerService.getData(shared.customerid).then(
                        function (data) { return data; }, 
                        function(error) { 
                            var modalOptions = {
                                closeButtonText: 'Close',
                                headerText: 'Customer Error',
                                bodyText: error
                            };
                            errorModalService.showModal({}, modalOptions);
                        }
                    );
                }
            }
         });