Czym są "dekoratorzy" i jak są wykorzystywane?

Jestem ciekaw, co dokładnie dekoratorzy są w AngularJS. W Internecie nie ma zbyt wiele informacji dla dekoratorów poza blurb w dokumentacji AngularJS i krótką (choć interesującą) wzmiankę w wideo na youtube.

Jak to ujęli kanciarze dekoratorem jest:

Dekoracja serwisu, pozwala dekoratorowi przechwycić usługę tworzenie instancji. Zwracana instancja może być oryginalną instancją, lub nowej instancji, która deleguje do oryginalna instancja.

Naprawdę Nie wiem, co to oznacza , i nie jestem pewien, dlaczego oddzieliłeś tę logikę od samego serwisu. Na przykład, gdybym chciał zwrócić coś innego w różnych warunkach, po prostu przekazałbym różne argumenty do odpowiednich funkcji lub użyłbym innej funkcji dzielącej ten Prywatny stan.

Nadal jestem trochę AngularJS noob więc jestem pewien, że to tylko ignorancja i / lub złe nawyki, które wychwyciłem.

Author: Rahil Wazir, 2013-04-18

5 answers

Dobrym przypadkiem użycia $provide.decorator jest sytuacja, gdy musisz wykonać drobne "tweak" na jakiejś zewnętrznej / upstreamowej usłudze,od której zależy twój moduł, pozostawiając usługę nienaruszoną (ponieważ nie jesteś właścicielem / opiekunem usługi). Tutaj {[3] } jest demonstracja na plunkr.

 214
Author: tamakisquare,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-12 09:41:48

Dekoratorzy pozwalają nam oddzielić przekrojowe obawy i umożliwić służbom zachowanie zasady jednolitej odpowiedzialności bez martwienia się o kod" infrastruktury".

Praktyczne zastosowania dekoratorów:

  • buforowanie: jeśli mamy usługę, która wykonuje potencjalnie drogie połączenia HTTP, możemy zawinąć usługę w dekorator buforowania, który sprawdza lokalny magazyn przed wykonaniem zewnętrznego połączenia.
  • debugowanie/ śledzenie: mieć przełącznik w zależności od Twojego konfiguracja rozwoju/produkcji, która dekoruje usługi opakowaniami do debugowania lub śledzenia.
  • Dławienie : zawijanie często wyzwalanych wywołań w opakowaniu debouncingowym. Umożliwia nam na przykład łatwą interakcję z usługami ograniczonymi stawkami.

We wszystkich tych przypadkach ograniczamy kod w Serwisie do jego głównej odpowiedzialności.

 65
Author: JBland,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-17 13:24:12

decorator może przechwycić instancję usługi utworzoną przez factory, service, value, provider i daje opcje do zmiany niektórych instance(service), które w przeciwnym razie nie są konfigurowalne / z opcjami.

Może również dostarczać przykładowe instancje do celów testowych, na przykład $http.

 10
Author: Daiwei,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-21 04:59:08

W prostym słowie możemy powiedzieć, że jest to jak metoda rozszerzenia. Dla Ex. Mamy klasę i ma ona dwie metody i w czasie uruchomienia chcemy dodać do niej więcej metod wtedy użyjemy dekoratora.

Nie możemy użyć $provide.dekorator z stałymi, ponieważ nie możemy zmienić stałych są one Falling tylko do odczytu właściwości.

 3
Author: Gurupreet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-12 15:42:36

W skrócie dekoratory można opisać następująco: -

Funkcja dekoratora przechwytuje Tworzenie usługi, pozwalając jej aby nadpisać lub zmodyfikować zachowanie usługi.

Korzysta z usługi $provide przez angular i modyfikuje lub zastępuje implementację innej usługi

$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;
}]);

Przykład:

$provide.decorator('$log', ['$delegate', function($delegate) {
  // This will change implementation of log.war to log.error
  $delegate.warn = $delegate.error; 
  return $delegate;
}]);

Aplikacje

Oprócz @jbland odpowiedz.

  • Ustawienia regionalne aplikacji:-

    Możesz tutaj znajdziesz Przykład
  • Changiging domyślne zachowanie i istniejąca implementacja usługi przez usługę kątową:-

    Możesz znaleźć przykład tutaj

  • Zachowanie przełączania funkcji w różnych środowiskach.

 1
Author: Samuel J Mathew,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-20 03:24:58