web-dev-qa-db-fra.com

Que sont les "décorateurs" et comment sont-ils utilisés?

Je suis curieux de savoir ce que sont exactement les décorateurs dans AngularJS. Il n’ya pas beaucoup d’informations en ligne pour les décorateurs à part un texte de présentation dans la documentation AngularJS et une brève mention (bien que intéressante) dans un vidéo sur youtube .

Comme le Angular les gars ont dit un décorateur est:

Décoration de service, permet au décorateur d'intercepter la création d'instance de service. L'instance renvoyée peut être l'instance d'origine ou une nouvelle instance qui délègue à l'instance d'origine.

Je ne sais pas vraiment ce que cela signifie et je ne suis pas sûr de savoir pourquoi vous sépareriez cette logique du service lui-même. Par exemple, si je voulais retourner quelque chose de différent dans des conditions différentes, je passerais simplement des arguments différents aux fonctions concernées ou utiliserais une autre fonction partageant cet état privé.

Je suis toujours un peu un noob AngularJS, alors je suis sûr que c'est juste de l'ignorance et/ou des mauvaises habitudes que j'ai prises.

147
Kevin Beal

Un bon cas d'utilisation de $provide.decorator est le moment où vous devez effectuer des modifications mineures sur un service tiers/en amont, dont dépend votre module, tout en laissant le service intact (car vous n’êtes pas le propriétaire/responsable du service). Ici est une démonstration sur plunkr.

217
tamakisquare

Les décorateurs nous permettent de séparer les problèmes transversaux et aux services de préserver le principe de responsabilité unique sans se soucier du code "infrastructure".

Utilisations pratiques des décorateurs:

  • Mise en cache: si nous avons un service qui effectue des appels HTTP potentiellement coûteux, nous pouvons envelopper le service dans un décorateur de mise en cache qui vérifie le stockage local avant de passer l'appel externe.
  • Débogage/traçage: utilisez un commutateur en fonction de votre configuration de développement/production qui décore vos services avec des wrappers de débogage ou de traçage.
  • Throttling: encapsule les appels fréquemment déclenchés dans un wrapper anti-rebond. Nous permet d’interagir facilement avec des services à tarif limité, par exemple.

Dans tous ces cas, nous limitons le code du service à sa responsabilité principale.

66
JBland

decorator peut intercepter une instance de service créée par factory, service, value, provider, et vous donne la possibilité de modifier certaines instance(service) qui ne sont autrement pas configurables/avec des options.

Il peut également fournir des exemples de maquette à des fins de test, par exemple $http.

10
Daiwei

Dans Word simple, on peut dire qu’il s’agit d’une méthode d’extension. Pour ex. Nous avons une classe et elle a deux méthodes et au moment de l'exécution, nous voulons ajouter plus de méthode à celle-ci, puis nous utilisons Decorator.

Nous ne pouvons pas utiliser $ supply.decorator avec des constantes car nous ne pouvons pas changer les constantes qu’ils soulèvent en lecture seule.

3
Gurupreet

En bref, les décorateurs peuvent être décrits comme suit: -

Une fonction de décorateur intercepte la création d'un service, ce qui lui permet de remplacer ou de modifier le comportement du service.

Il utilise le $provide service par angular et modifie ou remplace la mise en oeuvre d'un autre service

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

Exemple:

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

Applications

En plus de @JBland répondre.

  • Paramètres régionaux d'application larges: -

    Vous pouvez trouver un exemple ici

  • Modification du comportement par défaut et de la mise en œuvre existante d'un service par angular service: -

    Vous pouvez trouver un exemple ici

  • Changement de comportement d'une fonction dans différents environnements.

1
Samuel J Mathew