2013-12-10 2 views
0

Мне нравится показывать окно предупреждения каждый раз, когда запрос выполнен. Чтобы сократить мой путь, мне нравится использовать «оповещение о загрузке». Кажется, что нет доступа к любой области внутри фабрики. Как я могу понять что-то подобное?AngularJS Http Interceptor, Show Bootstrap Alert

app.factory('httpInterceptor', function ($q) { 
    return { 
     // On request success 
     request: function (config) { 
      $scope.alerts.push({msg: "Request done !"}); //There is no scope 
      return config || $q.when(config); 
     }, 
     // On request failure 
     requestError: function (rejection) { 
      return $q.reject(rejection); 
     }, 
     // On response success 
     response: function (response) { 
      return response || $q.when(response); 
     }, 
     // On response failure 
     responseError: function (rejection) { 
      return $q.reject(rejection); 
     } 
    }; 
}); 

См оповещения Пример на http://angular-ui.github.io/bootstrap/

+2

Я думаю, что здесь вы можете ввести $ rootScope. Попробуй. Используйте метод $ rootScope. $ Broadcast, чтобы поднять событие и поймать его на каком-то контроллере, чтобы показать позже. – Chandermani

ответ

1

Вы можете создать службу, которая будет впрыскиваемого в перехватчик и объем:

.factory('alerts', 

function() { 

    var alerts = []; 

    return { 

     getAlerts: function() { 
      return alerts; 
     }, 

     addAlert: function (msg) { 
      alerts.push({ msg: msg }); 
     }, 

     closeAlert: function (index) { 
      alerts.splice(index, 1); 
     } 
    } 
}) 

В контроллере сферы использовать его как это:

function($scope, alerts) { 
    $scope.alerts = alerts.getAlerts(); 
} 

И в самом перехватчике:

alerts.addAlert('msg'); 
1

Я знаю, что этот вопрос довольно старый, и, возможно, ОП нашел лучшее решение, но я предоставляю ответ здесь как ссылку на тех, кто не нашел решения.

Мы можем использовать $ broadcast метод доступен с бутстрапом. Подробнее о $ вещать здесь: https://docs.angularjs.org/api/ng/type/ $ rootScope.Scope # $ широковещательный

app.factory('httpInterceptor', function ($q) { 
    return { 
     // On request success 
     request: function (config) { 
      $rootScope.$broadcast("requestDone");    
      return config || $q.when(config); 
     }, 
     // On request failure 
     requestError: function (rejection) { 
      return $q.reject(rejection); 
     }, 
     // On response success 
     response: function (response) { 
      return response || $q.when(response); 
     }, 
     // On response failure 
     responseError: function (rejection) { 
      return $q.reject(rejection); 
     } 
    }; 
}); 

В контроллере, просто прослушивать событие как:

$rootScope.$on("loginStatus", function(e) { 
    $scope.alerts.push({msg: "Request done !"}); //There is scope 
}); 

Ура !!

Смежные вопросы