9
votes

Angulaire 2 - Injecter une dépendance dans une décoratrice usine

Y a-t-il un moyen d'injecter une dépendance dans une usine de décorateur, à l'aide de DI? Prenons le code suivant comme exemple simplifié: xxx

ici, le comportement prévu de la personne Decorator est pour accéder à une personne Dépendance et utilisez-la pour définir la propriété nom de la classe.

est-il possible du tout d'implémenter le nom décorateur pour le code ci-dessus ?


2 commentaires

Voulez-vous définir la valeur pour nom à partir de @personname () décorateur?


Oui c'est vrai.


4 Réponses :


5
votes

C'est un peu délicat de le faire, car les décorateurs sont exécutés au moment de la construction, pas au moment de l'exécution. Lorsque le décorateur est exécuté, il n'y a pas d'instance de la classe.

retour dans ng2.beta.10, j'ai utilisé ceci pour obtenir les données du service (ne pensez pas que vous puissiez du composant, mais je pourrais me tromper ... ): p>

// some-route.ts
@CanActivate((next, prev) => {
  let store: any = getSingleton(Store);
})

// injector.ts
import {Injector} from 'angular2/core'

let appInjectorRef: Injector;

export const appInjector = (injector?: Injector) => {
  if (injector)
    appInjectorRef = injector;
  return appInjectorRef;
}

export function getSingleton(token: any) {
  let injector: Injector = appInjector();
  return injector.get(token);
}


2 commentaires

Quelques crédits à Github.com/angular/angular/issues/4112#issuecomment-15381157 2 avec exemple Plunker.


Dans ~ 2.0.0 AppInjectorC () renvoie non défini.



-4
votes

Vous pouvez suivre:

export class AnnotationExample {
  @PersonName
  name: string;

  constructor() {
    alert(this.name);
  }
}

function PersonName(/*target: Function, fnName: string, fn: any*/) {
  return {value: 'amit'};
}

var whatIs = new AnnotationExample();


1 commentaires

La question concerne la manière dont on irait injecter un service dans un décorateur. Pas comment utiliser un décorateur. Plus précisément, ils souhaitent accéder à une dépendance à l'intérieur du décorateur, puis définissez la valeur de la propriété décorée nom dans le hellocomponent .



9
votes

Actuellement, pour injecter des dépendances dans mes décorateurs (et d'autres classes de module supplémentaires), j'utilise cette solution de contournement: xxx

après avoir été injecté sur le composant racine, il permet d'utiliser la méthode Static Obtenir la méthode. Pour obtenir des dépendances pendant l'exécution des fonctions d'exécution. Toujours à la recherche d'une meilleure solution.


1 commentaires

Je pense que vous avez oublié d'ajouter le code de votre définition de module, n'est-ce pas? Quelque chose comme l'ajout .then () jusqu'au bout afin de définir les valeurs de dépendance?



1
votes

Une façon de le faire en angulaire 7 est la suivante:

app.module.ts xxx

décorateur.service. TS xxx

autre.service.ts xxx


0 commentaires