我们可以在Angular JS的装饰器中访问$ provide吗?

时间:2016-05-19 05:57:09

标签: javascript angularjs angular-decorator

最近我遇到了一个测验,问题是

data='';
for(var i = 0; i < json.length; i++) {
   var str1 =  json[i]['link-text'];
   if(i !== json.length - 1) str1 += ' / ';
   data = data.concat(str1)
 }

我选择b。$ delegate并且测验表明这是错误的,测验说正确答案是a.Both。

所以我想知道这是否属实,我认为装饰器在提供者内部,即他们是由提供者调用的服务,他们可以像本例中那样使用$ delegate

Decorators use 

Select one:
a. Both
b. $delegate
c. None
d. $provide

另外,在decorator documentation中声明了

  

当需要实例化服务并且应该返回修饰的服务实例时,将调用此函数。该函数使用injector.invoke方法调用,因此可完全注入。本地注射参数:

     

$ delegate - 原始服务实例,可以进行猴子修补,配置,修饰或委托。

所以,我错过了什么或测验错了,或者我错了,有人可以帮我理解这一点。

1 个答案:

答案 0 :(得分:1)

是的,正确答案都是。作为示例,这是一段代码,其中使用自定义服务$loglogEnchance服务设置装饰器以添加自定义功能。在这种情况下,logEnchance会向外部日志服务发帖。

angular.module('angularApp').config(configureLogger);

// The decorator allows us to inject custom behaviors
function configureLogger($provide) {

    // registers a value/object that can be accessed by providers and services
    $provide.constant('logDecorator', logDecorator);

    // registers a decorator function
    // $provide.decorator intercept $log service letting us add custom functionality
    $provide.decorator('$log', logDecorator);

    // inject dependencies into logDecorator function
    logDecorator.$inject = ['$delegate', 'logEnchance'];

    function logDecorator($delegate, logEnchance) {
        // logEnchance is the service who modify the $log service
        logEnchance( $delegate );
        return $delegate;
    }
}