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

148

Je suis curieux de savoir ce que sont exactement les décorateurs dans AngularJS. Il n'y a pas beaucoup d'informations en ligne pour les décorateurs, à l'exception d'un texte de présentation dans la documentation d'AngularJS et d'une brève mention (bien que intéressante) dans une vidéo YouTube .

Comme le disent les gars Angular, un décorateur est:

Décoration de service, permet au décorateur d'intercepter la création de l'instance de service. L'instance retourné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 sais pas 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 différents arguments aux fonctions pertinentes ou utiliserais une autre fonction partageant cet état privé.

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

Kevin Beal
la source

Réponses:

219

Un bon cas d'utilisation de $provide.decoratorest lorsque vous avez besoin de faire des «ajustements» mineurs 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 / mainteneur du service). Voici une démonstration sur plunkr.

tamakisquare
la source
6
Exemple génial. Je me demandais en fait comment étendre les fonctionnalités des modules tiers sans me mêler d'eux
Arthur Kovacs
5
Les décorateurs tapent-ils réellement toutes les instances d'un service ou sont-ils limités au module qui les décore? En d'autres termes, disons que j'ai le module A qui décore un service du module B. J'ai alors le module C qui dépend du module A et du module B. À l'intérieur du module C, le service du module B est-il la version originale ou décorée?
Jon Jaques
3
@JonJaques - C'est une excellente question. Je n'ai pas rencontré une telle situation. Si je devais deviner, la version du service que le module C voit devrait être celle décorée du module A mais je ne peux pas le dire avec certitude avant de l'essayer moi-même. Pourquoi n'écrivez-vous pas un simple plunkr / jsffidle et expérimentez-le. Ce serait génial si vous pouviez partager votre découverte avec nous. À votre santé.
tamakisquare
6
@JonJaques - Je n'ai pas pu retenir ma curiosité, j'ai donc ajouté quelques lignes à mon exemple d'origine pour trouver la réponse à votre question, lien . En bref, la supposition dans mon commentaire précédent est juste.
tamakisquare
17
Les usines, services, etc. sont des singletons (tels qu'ils sont fournis), donc une fois décorés, toujours décorés.
FlavorScape
66

Les décorateurs nous permettent de séparer les préoccupations transversales et permettent aux services de préserver le principe de responsabilité unique sans se soucier du code «d'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 faire l'appel externe.
  • Débogage / traçage: ayez 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.
  • Limitation: enveloppez 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.

JBland
la source
10

decoratorpeut intercepter l'instance de service créée par factory, service, value, provider, et donne les options pour en changer certaines instance(service)qui ne sont pas configurables autrement / avec des options.

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

Daiwei
la source
1
Il est à noter que vous pouvez également remplacer les directivedéfinitions présentées par Ben Nadel
David Salamon
Voici la référence dans la documentation officielle Angular: https://docs.angularjs.org/guide/decorators
David Salamon
3

En termes simples, nous pouvons dire que c'est comme 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 y ajouter plus de méthode, puis nous utilisons Decorator.

Nous ne pouvons pas utiliser $ provide.decorator avec des constantes car nous ne pouvons pas modifier les constantes dont elles sont en train de créer une propriété en lecture seule.

Gurupreet
la source
1

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

Une fonction décoratrice intercepte la création d'un service, lui permettant de remplacer ou de modifier le comportement du service.

Il utilise le $provideservice par angular et modifie ou remplace l'implémentation 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 la réponse @JBland.

  • Paramètres régionaux de l'application: -

    Vous pouvez trouver un exemple ici

  • Modification du comportement par défaut et de l'implémentation existante d'un service par un service angulaire: -

    Vous pouvez en trouver un ici

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

samuelj90
la source