J'ai un ensemble de composants angular2 qui devraient tous recevoir un service injecté. Ma première idée était qu'il serait préférable de créer une superclasse et d'y injecter le service. Tous mes composants devraient alors étendre cette superclasse, mais cette approche ne fonctionne pas.
Exemple simplifié :
export class AbstractComponent {
constructor(private myservice: MyService) {
// Inject the service I need for all components
}
}
export MyComponent extends AbstractComponent {
constructor(private anotherService: AnotherService) {
super(); // This gives an error as super constructor needs an argument
}
}
Je pourrais résoudre ce problème en injectant MyService
à l'intérieur de chaque composant et utiliser cet argument pour les super()
mais c'est définitivement une sorte d'absurdité.
Comment organiser correctement mes composants pour qu'ils héritent d'un service de la super classe ?
0 votes
Il ne s'agit pas d'un doublon. La question à laquelle il est fait référence concerne la construction d'une classe DERIVÉE qui peut accéder à un service injecté par une super classe déjà définie. Ma question est de savoir comment construire une classe SUPER qui hérite d'un service pour les classes dérivées. C'est simplement l'inverse.
0 votes
Votre réponse (en ligne dans votre question) n'a pas de sens pour moi. De cette façon, vous créez un injecteur qui est indépendant de l'injecteur qu'Angular utilise pour votre application. Utilisation de
new MyService()
au lieu de l'injection vous donne exactement le même résultat (sauf qu'il est plus efficace). Si vous voulez partager la même instance de service entre différents services et/ou composants, cela ne fonctionnera pas. Chaque classe recevra une autreMyService
instance.0 votes
Vous avez tout à fait raison, mon code va générer beaucoup d'instances de
myService
. J'ai trouvé une solution qui évite cela mais qui ajoute plus de code aux classes dérivées...0 votes
L'injection de l'injecteur n'est une amélioration que lorsqu'il y a plusieurs services différents qui doivent être injectés à de nombreux endroits. Vous pouvez également injecter un service qui a des dépendances vers d'autres services et les fournir en utilisant un getter (ou une méthode). De cette façon, vous n'avez besoin d'injecter qu'un seul service mais vous pouvez utiliser un ensemble de services. Votre solution et l'alternative que je propose ont toutes deux l'inconvénient de rendre plus difficile de voir quelle classe dépend de quel service. Je préférerais créer des outils (comme les modèles en direct dans WebStorm) qui facilitent la création du code passe-partout et l'explicitation des dépendances.