Angular - Декорирующие директивы

Я пытаюсь использовать Angular "декоратор", чтобы добавить функциональность к некоторым директивам. Предположим, что мое директивное имя - myDirective. Мой код выглядит следующим образом:

angular.module('app').config([
  '$provide', function($provide) {
    return $provide.decorator('myDirective', [
      '$delegate', '$log', function($delegate, $log) {
        // TODO - It worked!  Do something to modify the behavior

        $log.info("In decorator");
      }
    ]);
  }

]);

Я продолжаю получать это сообщение:

Uncaught Error: [$injector:unpr] Unknown provider: myDirectiveProvider from app 

В меру моих возможностей, директивы уже зарегистрированы к моменту выполнения функции декоратора. Любое понимание будет оценено!

Ответ 1

В этой статье показано, как вы можете использовать decorator() с помощью директив.

Вам просто нужно включить "Директива" в качестве суффикса для имени. Следовательно, в моем примере я должен был делать

return $provide.decorator('myDirectiveDirective', ['$delegate', '$log', function($delegate, $log) {
    // TODO - It worked!  Do something to modify the behavior
    $log.info("In decorator");

    // Article uses index 0 but I found that index 0 was "window" and index 1 was the directive
    var directive = $delegate[1];
}

http://angular-tips.com/blog/2013/09/experiment-decorating-directives/

Ответ 2

Декораторы, созданные с помощью метода decorator, предназначены только для служб. Они должны быть созданы с помощью service, factory, provider или value. См. Документы здесь.

Если вы хотите украсить директиву, вы можете создать другую директиву с тем же именем. Обе директивы будут использоваться при компиляции DOM, и вы можете определить порядок компиляции, используя приоритет.

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