109 votes

Comment injecter le service en classe (pas composant)

Je veux injecter un service en classe qui ne soit pas composé.

Par exemple

Myservice

 import {Injectable} from '@angular/core';
@Injectable()
export class myService{
  dosomething(){
    //implementation
  }
}
 

Ma classe

 import { myService } from './myService'
export class MyClass{
  constructor(private myservice:myService){

  }
  test(){
     this.myservice.dosomething();
  }
}
 

cette solution ne fonctionne pas (je pense parce que MyClass n'a pas encore instancié).

Existe-t-il un autre moyen d'utiliser le service en classe (sans composant)? ou c'est mal comment je conçois le code (pour utiliser le service dans une classe pas un composant)

Je vous remercie.

67voto

Günter Zöchbauer Points 21340

Les Injections ne fonctionne qu'avec des classes qui sont instanciés par Angulars l'injection de dépendance (DI).

  1. Vous avez besoin de
    • ajouter @Injectable() de MyClass et
    • fournir de l' MyClass comme providers: [MyClass] dans un composant ou NgModule.

Lorsque vous ensuite injecter de l' MyClass quelque part, un MyService exemple est passée de MyClass lorsqu'il est instancié par DI (avant de l'utiliser la première fois).

  1. Une approche alternative consiste à configurer une coutume de l'injecteur comme
constructor(private injector:Injector) { 
  let resolvedProviders = ReflectiveInjector.resolve([MyClass]);
  let childInjector = ReflectiveInjector.fromResolvedProviders(resolvedProviders, this.injector);

  let myClass : MyClass = childInjector.get(MyClass);
}

De cette façon, myClass sera MyClass instance, instancié par Angulars DI, et myService seront injectés MyClass lorsqu'il est instancié.
Voir aussi l'Obtention de la dépendance de l'Injecteur manuellement à l'intérieur d'une directive

  1. Une autre façon est de créer l'instance de vous-même:
constructor(ms:myService)
let myClass = new MyClass(ms);

32voto

Ryan Crews Points 1111

Pas une réponse directe à la question, mais si vous êtes la lecture de ce DONC pour cette raison que je suis, cela peut aider...

Disons que vous êtes à l'aide de ng2-traduire et vous voulez vraiment que votre User.ts classe de l'avoir. Vous êtes immédiate de la pensée est d'utiliser DI placer, vous faites Angulaire, après tout. Mais c'est un peu de l'avoir à y penser, vous pouvez passer à votre constructeur, ou à en faire une variable publique de la composante (où vous probablement avez-DI).

par exemple:

import { TranslateService } from "ng2-translate";

export class User {
  public translateService: TranslateService; // will set from components.

  // a bunch of awesome User methods
}

puis, à partir de certaines liées à l'utilisateur, composant injecté TranslateService

addEmptyUser() {
  let emptyUser = new User("", "");
  emptyUser.translateService = this.translateService;
  this.users.push(emptyUser);
}

Espérons que cela aide ceux qui comme moi étaient sur le point d'écrire beaucoup plus difficile le maintien de code, parce que nous sommes trop intelligent, parfois,=]

(NOTE: la raison pour laquelle vous pouvez définir une variable au lieu de faire partie de votre méthode constructeur est vous pourriez avoir des cas où vous n'avez pas besoin d'utiliser le service, afin de toujours être tenu à faire passer dans signifierait l'introduction supplémentaire des importations/code qui ne sont jamais vraiment utilisé)

22voto

Kilves Points 326

C'est le genre de (très) hacky, mais j'ai pensé que je devais partager ma solution. Notez que cela ne fonctionne qu'avec Singleton services (injecté à la racine d'application, pas de composant!), depuis ils vivent aussi longtemps que votre application, et il n'y a qu'une seule instance.

Tout d'abord, à votre service:

@Injectable()
export class MyService {
    static instance: MyService;
    constructor() {
        MyService.instance = this;
    }

    doSomething() {
        console.log("something!");
    }
}

Ensuite à toute la classe:

export class MyClass {
    constructor() {
        MyService.instance.doSomething();
    }
}

Cette solution est bonne si vous voulez réduire l'encombrement de code et ne l'utilisez pas non-singleton services de toute façon.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X