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


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.