【问题标题】:Calling service from app.config从 app.config 调用服务
【发布时间】:2015-04-28 13:26:51
【问题描述】:

我创建了一个$httpProvider 拦截器,就像here 描述的那样:

$httpProvider.interceptors.push(function ($q) {
    return {
        'responseError': function (response) {

            var _status,
                _message;

            switch (response.status) {
                case 403:
                    _status = 'warning';
                    _message = 'no rights to do this';
                    break;
                case 500:
                    _status = 'danger';
                    _message = 'internal server error';
                    break;
            }


            Alert.add({status: _status, msg: _message});

            return $q.reject(response);
        }
    };
});

Alert 是我熟悉的一项服务,用于显示通知、错误等。它依赖于$rootScope,只是添加了一个要在 html 中呈现的对象。

所以问题是:如何从定义此拦截器的app.config 调用我的Alert 服务?或者,如果不可能,我怎样才能在一个地方捕获所有 http 错误并显示它们?

【问题讨论】:

  • 从 app.config 调用我的警报服务是什么意思?你想配置它吗?那么_如何在一个地方捕获所有http错误并显示它们_?这不就是这段代码应该做的吗?
  • 好吧,为了显示错误,我想使用服务警报。而且这段代码显然不起作用,因为我无法从拦截器调用服务
  • 你试过function ($q, AlertService)吗?
  • 哇,愚蠢的我。这行得通!
  • @zeroflagL 我认为function ($q, AlertService) 行不通..

标签: javascript angularjs


【解决方案1】:

你需要使用$injector,然后在拦截器中你可以通过$injector.get任何服务名称来获取服务。

代码

$httpProvider.interceptors.push(function ($q, $injector) {
    return {
        'responseError': function (response) {
            var service = $injector.get('myService'); //here you can get service
            var _status,
                _message;

            switch (response.status) {
                case 403:
                    _status = 'warning';
                    _message = 'no rights to do this';
                    break;
                case 500:
                    _status = 'danger';
                    _message = 'internal server error';
                    break;
            }


            Alert.add({status: _status, msg: _message});

            return $q.reject(response);
        }
    };
});

更新

根据@zeroflagL 解决方案,它可以通过仅在函数中直接依赖注入服务以更简单的方式工作。

代码

$httpProvider.interceptors.push(function ($q, myService) {
    return {
        'responseError': function (response) {
            var _status,
                _message;

            switch (response.status) {
                case 403:
                    _status = 'warning';
                    _message = 'no rights to do this';
                    break;
                case 500:
                    _status = 'danger';
                    _message = 'internal server error';
                    break;
            }


            Alert.add({status: _status, msg: _message});

            return $q.reject(response);
        }
    };
});

【讨论】:

  • @k102 我不认为这样的解决方案会起作用..你能确认一下吗?
  • 他的解决方案完全符合我的要求,现在我正在使用它。因此,如果该评论将成为答案,我会接受它
  • @k102 我更新了答案。请看一下..但是 zeroflagL 建议的方式不适用于$modal 服务..我不知道为什么?我在前一天遇到了同样的问题..
猜你喜欢
  • 1970-01-01
  • 2013-03-02
  • 2017-01-11
  • 2013-08-17
  • 2018-01-01
  • 2013-09-09
  • 2012-04-02
  • 1970-01-01
  • 2011-02-10
相关资源
最近更新 更多