Что такое" декораторы " и как они используются?
Мне любопытно, что именно декораторы находятся в AngularJS. Существует не так много информации в интернете для декораторов за исключением рекламного объявления в документация AngularJS и краткое (хотя и интересное) упоминание в youtube video.
Как говорят угловатые ребята декоратор:
украшение обслуживания, позволяет декоратору перехватить обслуживание создание экземпляров. Возвращенный экземпляр может быть исходным экземпляром, или новый экземпляр, который делегирует исходный экземпляр.
Я действительно не знаю, что это означает и я не уверен, почему вы хотели отделить эту логику от самой службы. Например, если бы я хотел вернуть что-то другое при разных условиях, я бы просто передал разные аргументы соответствующим функциям или использовал другую функцию, разделяющую это частное состояние.
Я все еще вроде AngularJS noob, поэтому я уверен, что это просто невежество и / или плохие привычки я подхватил.
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 ответ.