Що таке "декоратори" і як вони використовуються?


148

Мені цікаво, які саме декоратори в AngularJS. В Інтернеті не так багато інформації для декораторів, крім економії розмитості в документації AngularJS та короткої (хоч і цікавої) згадки у відео на YouTube .

Як кутові хлопці вважають це декоратором:

Прикраса послуги дозволяє декоратору перехопити створення екземпляра служби. Повернений екземпляр може бути оригінальним екземпляром або новим екземпляром, який делегує оригінальному екземпляру.

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

Я як і раніше є нобулом AngularJS, тому я впевнений, що я підхопив лише незнання та / або шкідливі звички.

Відповіді:


219

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


6
Дивовижний приклад. Мені справді було цікаво, як розширити функціональність сторонніх модулів, не втручаючись у них
Артур Ковач

5
Чи декоратори насправді каченяти всі випадки послуги, або вони прилаштовані лише до модуля, який їх прикрашає? Іншими словами, скажіть, що у мене є модуль A, який прикрашає послугу з модуля B. Тоді у мене є модуль C, який залежить від модуля A і модуля B. Всередині модуля C, чи є послуга з модуля B оригінальною чи оформленою версією?
Джон Жак

3
@JonJaques - Це чудове питання. Я не стикався з такою ситуацією. Якби я здогадувався, версія сервісу, яку бачить модуль C, повинна бути прикрашеною з модуля A, але я не можу цього сказати точно, поки не спробую сам. Чому б вам не написати простий plunkr / jsffidle і не експериментувати з цим. Було б дивним, якби ви могли поділитися своїми висновками з нами. Ура.
tamakisquare

6
@JonJaques - Не вдалося стримати цікавість, тому я додав кілька рядків до свого оригінального прикладу, щоб знайти відповідь на ваше запитання, посилання . Коротше кажучи, здогадка в моєму попередньому коментарі вірна.
tamakisquare

17
Заводи, послуги тощо є одинаковими (як вони надаються), тому колись оформлені, завжди прикрашені.
FlavorScape

66

Декоратори дозволяють нам відокремити наскрізні проблеми та дозволяють службам зберігати принцип єдиної відповідальності, не турбуючись про "інфраструктурний" код.

Практичне використання декораторів:

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

У всіх цих випадках ми обмежуємо код у службі своїм основним обов'язком.


10

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

Наприклад, він також може надати макетні екземпляри для тестування, наприклад $http.


1
Варто зазначити, що ви також можете перекрити directiveвизначення, представлені Бен Наделом
Девід Саламон

Ось посилання на офіційні документи Angular: https://docs.angularjs.org/guide/decorators
Девід Саламон

3

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

Ми не можемо використовувати $ provide.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

  • Налаштування широкої локальної програми: -

    Ви можете знайти приклад тут

  • Змінення поведінки за замовчуванням та існуючої реалізації послуги за допомогою кутового сервісу: -

    Ви можете знайти приклад тут

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.