2013-04-18 3 views
139

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

Как Угловые ребята положить его декоратор является:

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

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

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

ответ

211

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

+5

Удивительный пример. Я действительно интересовался, как расширить функциональность модулей сторонних модулей, не вмешиваясь в них. –

+5

Действительно ли декораторы фактически уткают все экземпляры службы, или они охвачены только модулем, который их украшает? Другими словами, скажем, у меня есть модуль A, который украшает сервис из модуля B. Тогда у меня есть модуль C, который зависит от модуля A и модуля B. Внутри модуля C используется сервис из модуля B оригинальной или оформленной версии? –

+2

@JonJaques - Это отличный вопрос. Я не сталкивался с такой ситуацией. Если бы я мог догадаться, версия службы, которую модуль C видит, должна быть украшена из модуля A, но я не могу сказать это точно, пока я не попробую сам. Почему бы вам не написать простой plunkr/jsffidle и поэкспериментировать с этим. Было бы здорово, если бы вы могли поделиться своим поиском с нами. Приветствия. – tamakisquare

63

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

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

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

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

10

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

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

+1

Стоит отметить, что вы также можете переопределить определения директивы в качестве [представленных Бен Надел] (http://www.bennadel.com/?site-photo=490) –

+0

Вот ссылка в официальные Угловые документы: [https://docs.angularjs.org/guide/decorators](https://docs.angularjs.org/guide/decorators) –

3

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

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

1

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

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

Он использует $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 ответ.

  • Применение широкие региональные настройки: -

    Вы можете найти пример here

  • поведение Changiging по умолчанию и существующей реализации сервиса по угловым услугам: -

    Вы можете найти a eample here

  • Switching behavi или функции в разных средах.