Что такое" декораторы " и как они используются?


Мне любопытно, что именно декораторы находятся в AngularJS. Существует не так много информации в интернете для декораторов за исключением рекламного объявления в документация AngularJS и краткое (хотя и интересное) упоминание в youtube video.

Как говорят угловатые ребята декоратор:

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

Я действительно не знаю, что это означает и я не уверен, почему вы хотели отделить эту логику от самой службы. Например, если бы я хотел вернуть что-то другое при разных условиях, я бы просто передал разные аргументы соответствующим функциям или использовал другую функцию, разделяющую это частное состояние.

Я все еще вроде AngularJS noob, поэтому я уверен, что это просто невежество и / или плохие привычки я подхватил.

5 143

5 ответов:

хороший вариант использования $provide.decorator Это когда вам нужно сделать незначительную "настройку" на какой-то сторонней/восходящей службе, от которой зависит ваш модуль, оставляя службу нетронутой (потому что вы не являетесь владельцем/сопровождающим службы). здесь - это демонстрация на plunkr.

декораторы позволяют нам отделить сквозные проблемы и позволить сервисам сохранить принцип единой ответственности, не беспокоясь о "инфраструктурном" коде.

практическое использование декораторов:

  • кэширование: если у нас есть служба, которая делает потенциально дорогие HTTP-вызовы, мы можем обернуть службу в декоратор кэширования, который проверяет локальное хранилище перед выполнением внешнего вызова.
  • отладка / трассировка: есть переключатель в зависимости на вашей конфигурации разработки / производства, которая украшает ваши услуги отладкой или трассировкой оберток.
  • дросселирование: обертывание часто вызываемых вызовов в оболочке разборки. Например, позволяет нам легко взаимодействовать с услугами с ограниченной скоростью.

во всех этих случаях мы ограничиваем код в сервисе его основной ответственностью.

decorator может перехватить экземпляр службы создается factory, service, value, provider, и дает возможность изменить некоторые instance(service) это в противном случае не настраивается / с опциями.

Он также может предоставлять макетные экземпляры для целей тестирования, например $http.

простым словом можно сказать, что это как метод расширения. Например. У нас есть класс, и он имеет два метода, и во время выполнения мы хотим добавить в него больше метода, чем мы используем Decorator.

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

короче декораторов можно описать следующим образом :-

функция декоратора перехватывает создание сервиса, позволяя ему чтобы переопределить или изменить поведение службы.

использует $provide сервис по угловой и изменить или заменить реализацию другой службы

$provide.decorator('service to decorate',['$delegate', function($delegate) {
  // $delegate - The original service instance, 
  //             which can be replaced, monkey patched, 
  //             configured, decorated or delegated to. 
  //             ie here what is there in the 'service to decorate'

  //   This function will be invoked, 
  //   when the service needs to be provided 
  //   and should return the decorated service instance.
  return $delegate;
}]);

пример:

$provide.decorator('$log', ['$delegate', function($delegate) {
  // This will change implementation of log.war to log.error
  $delegate.warn = $delegate.error; 
  return $delegate;
}]);

приложения

В дополнение к @JBland ответ.

  • применение широкие настройки локали: -

    вы можете найти пример здесь

  • изменение поведения по умолчанию и существующей реализации службы с помощью angular service: -

    вы можете найти пример здесь

  • переключение поведения функции в различных средах.