0

我为 NotificationService 编写了一个工厂,它将在我的拦截器中调用以检测 HTTP 4xx 状态代码并导致警报显示在屏幕顶部。警报使用AngularStrap 的警报模块

应用程序.js

var app = angular.module('app', [
  'app.filters',
  'app.services',
  'mgcrea.ngStrap.alert'
]);

var Svc = angular.module('app.services', []);

app.config(function($stateProvider, $urlRouterProvider, $httpProvider) {
  // Setup all states here…
  $stateProvider
     .state('home')
     .state('about')
     .state('blog');
  // Interceptor
  $httpProvider.interceptors.push("myInterceptor");
});

NotificationService.js

Svc.factory('NotificationService', function($alert) {
  var obj = {};

  // default options for AngularStrap $alert
  var default_options = {
    placement: 'top',
    show: true,
    duration: 3,
    container: 'body'
  }
  obj.error = function(data) {
    angular.extend(default_options, data);  // Merge 'message' property of data into default options
    default_options.type = 'danger';
    $alert(default_options);    // This triggers the alert appearing in the view
  }
  return obj;
});

myInterceptor.js

Svc.factory('myInterceptor', function($q, NotificationService) {
   return {
        responseError: function (response) {
            // Show an alert with the message property in response.data
            NotificationService.error(response.data);

            // do something on error
            return $q.reject(response);
        }
    };
});

我的代码有些地方非常错误,但我不确定在哪里。阅读 AngularStrap 的文档,它提到它$alert作为服务公开,可以在控制器/指令中使用。如果我在另一家工厂使用它有关系吗?是我如何包含mgcrea.ngStrap.alert依赖项(应该在 app.services 数组中)吗?

我不记得确切的错误信息(它正在工作),但错误指向this。我能记住的错误是它打印出如下内容:

$modalProvider <- $alert <- NotifcationService <- <blah blah blah>

我希望这有帮助。

4

2 回答 2

0

在您的拦截器中注入 $injector 并在 $http 初始化后使用它来检索依赖项,就在您需要它们的时候。这些依赖项是您的应用程序的注册服务,不会重新创建!

资料来源:我需要 AngularJS $http 服务的两个实例还是什么?

于 2014-10-15T15:50:09.423 回答
0

他们的文档说您还需要包含模态模块,可能在警报模块之前

mgcrea.ngStrap.modal

是的,它绝对应该作为依赖项包含在您实际注入 $alert 服务的模块中,即 app.services

于 2014-02-19T19:27:06.530 回答