Можем ли мы получить доступ к $provide внутри декоратора в Angular JS?

Недавно я наткнулся на викторину, и вопрос

Decorators use 

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

Я выбираю b.$delegate, и викторина говорит, что это неправильно, и викторина говорит, что правильный ответ — a.Both.

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

 app.config(function ($provide) {
  $provide.decorator('movieTitle', function ($delegate) {
    return $delegate + ' - starring Keanu Reeves';
  });
});

кроме того, в документации по декоратору указано, что

Эта функция будет вызываться, когда необходимо создать экземпляр службы, и должна возвращать оформленный экземпляр службы. Функция вызывается методом инжектора.invoke и, следовательно, является полностью инжектируемой. Аргументы локальной инъекции:

$delegate — исходный экземпляр службы, который может быть исправлен, настроен, декорирован или делегирован.

Итак, я что-то упустил, или тест неправильный, или я ошибаюсь, может кто-нибудь, пожалуйста, помогите мне понять это.


person Devanshi Parikh    schedule 19.05.2016    source источник


Ответы (1)


Да, правильный ответ - оба. В качестве примера, это фрагмент кода, в котором для службы $log устанавливается декоратор, использующий пользовательскую службу logEnchance для добавления пользовательских функций. В этом случае 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;
    }
}
person aUXcoder    schedule 23.06.2016