Что такое "декораторы" и как они используются?
Мне интересно, какие именно декораторы есть в AngularJS. В Интернете не так много информации для декораторов, за исключением рекламы в документации AngularJS и краткого (хотя и интересного) упоминания в видео на YouTube.
Как говорят ребята из Angular, декоратор это:
Оформление сервиса, позволяет декоратору перехватить создание экземпляра сервиса. Возвращаемый экземпляр может быть исходным экземпляром или новым экземпляром, который делегирует исходному экземпляру.
Я действительно не знаю, что это значит, и я не уверен, почему вы должны отделить эту логику от самого сервиса. Например, если бы я хотел вернуть что-то другое в других условиях, я бы просто передавал различные аргументы соответствующим функциям или использовал другую функцию, разделяющую это частное состояние.
Я все еще в некотором роде AngularJS, так что я уверен, что это просто невежество и / или вредные привычки, которые я подхватил.
5 ответов
Хороший вариант использования $provide.decorator
это когда вам нужно сделать небольшую "подстройку" к какой-либо сторонней / восходящей службе, от которой зависит ваш модуль, при этом оставив службу без изменений (поскольку вы не являетесь владельцем / сопровождающим службы). Вот демонстрация на планкр.
Декораторы позволяют нам выделять сквозные проблемы и позволяют сервисам сохранять принцип единой ответственности, не беспокоясь о "инфраструктурном" коде.
Практическое использование декораторов:
- Кэширование: если у нас есть сервис, который выполняет потенциально дорогие HTTP-вызовы, мы можем обернуть сервис в декоратор кэширования, который проверяет локальное хранилище перед выполнением внешнего вызова.
- Отладка / Трассировка: есть переключатель в зависимости от конфигурации разработки / производства, который украшает ваши сервисы обертками отладки или трассировки.
- Регулирование: оборачивать часто вызываемые вызовы в обертку для устранения помех. Позволяет нам легко взаимодействовать, например, с ограниченными тарифами.
Во всех этих случаях мы ограничиваем код в сервисе до его основной ответственности.
decorator
может перехватить экземпляр службы, созданный factory, service, value, provider
и дает возможность изменить некоторые instance(service)
в противном случае это не настраивается / с параметрами.
Он также может предоставить макеты для тестирования, например $http
,
Проще говоря, мы можем сказать, что это как метод расширения. Например У нас есть класс, и у него есть два метода, и во время выполнения мы хотим добавить в него больше методов, чем используем Decorator.
Мы не можем использовать $provide.decorator с константами, потому что мы не можем изменить константы, для которых они имеют свойство только для чтения.
Вкратце декораторы можно описать следующим образом:
Функция декоратора перехватывает создание сервиса, позволяя ему переопределить или изменить поведение сервиса.
Он использует $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.