J'ai un problème lors du chargement d'une classe dans un composant angulaire. J'essaie de le résoudre depuis longtemps; J'ai même essayé de tout joindre dans un seul fichier. Ce que j'ai c'est:
Application.ts
/// <reference path="../typings/angular2/angular2.d.ts" />
import {Component,View,bootstrap,NgFor} from "angular2/angular2";
import {NameService} from "./services/NameService";
@Component({
selector:'my-app',
injectables: [NameService]
})
@View({
template:'<h1>Hi {{name}}</h1>' +
'<p>Friends</p>' +
'<ul>' +
' <li *ng-for="#name of names">{{name}}</li>' +
'</ul>',
directives:[NgFor]
})
class MyAppComponent
{
name:string;
names:Array<string>;
constructor(nameService:NameService)
{
this.name = 'Michal';
this.names = nameService.getNames();
}
}
bootstrap(MyAppComponent);
services / NameService.ts
export class NameService {
names: Array<string>;
constructor() {
this.names = ["Alice", "Aarav", "Martín", "Shannon", "Ariana", "Kai"];
}
getNames()
{
return this.names;
}
}
Je reçois toujours un message d'erreur No provider for NameService
.
Quelqu'un peut-il m'aider à détecter le problème avec mon code?
typescript
angular
systemjs
M.Svrcek
la source
la source
Réponses:
Vous devez utiliser
providers
au lieu deinjectables
Exemple de code complet ici .
la source
providers
travaux sur la dernière version bêta (beta 0).bindings
Dans Angular 2, vous pouvez "fournir" trois services:
"L'option du fournisseur d'amorçage est conçue pour configurer et remplacer les propres services préenregistrés d'Angular, tels que sa prise en charge du routage." - référence
Si vous ne souhaitez qu'une seule instance de NameService sur l'ensemble de votre application (c.-à-d. Singleton), incluez-la dans le
providers
tableau de votre composant racine:Plunker
Si vous préférez avoir une instance par composant, utilisez plutôt le
providers
tableau dans l'objet de configuration du composant:Consultez le document Injecteurs hiérarchiques pour plus d'informations.
la source
Depuis Angular 2 Beta:
Ajoutez
@Injectable
à votre service en tant que:et à votre configuration de composant, ajoutez le
providers
comme:la source
Vous devriez injectez à l'
NameService
intérieur deproviders
tableau de votreAppModule
de »NgModule
métadonnées.Si vous souhaitez créer une dépendance pour un niveau de composant particulier sans vous soucier de l'état de votre application, vous pouvez injecter cette dépendance sur l'
providers
option de métadonnées de composant comme la réponse @Klass acceptée illustrée.la source
DataManagerService
est-ce que le@Injectable
décorateur est dessus?Étonnamment, la syntaxe a encore changé dans la dernière version d'Angular :-) Depuis les documents d' Angular 6 :
src / app / user.service.0.ts
la source
Vous devez injecter NameService dans le tableau des fournisseurs de métadonnées NgModule de votre AppModule.
et assurez-vous d'importer dans votre composant par le même nom (sensible à la casse), car SystemJs est sensible à la casse (par conception). Si vous utilisez un nom de chemin différent dans vos fichiers de projet comme ceci:
main.module.ts
your-component.ts
alors le système js fera des doubles importations
la source
Dans Angular v2 et plus, c'est maintenant:
@Component({ selector:'my-app', providers: [NameService], template: ... })
la source
Angular 2 a changé, voici à quoi devrait ressembler le haut de votre code:
Vous pouvez également utiliser des getters et setters à votre service:
Ensuite, dans votre application, vous pouvez simplement faire:
Je vous suggère d'aller sur plnkr.co et de créer un nouveau plunk Angular 2 (ES6) et de le faire fonctionner en premier. Il mettra tout en place pour vous. Une fois que cela fonctionne, copiez-le dans votre autre environnement et triez tous les problèmes avec cet environnement.
la source
L'erreur
No provider for NameService
est un problème commun auquel de nombreux débutants Angular2 sont confrontés.Raison : Avant d'utiliser un service personnalisé, vous devez d'abord l'enregistrer auprès de NgModule en l'ajoutant à la liste des fournisseurs:
Solution:
la source
Vous pouvez également faire déclarer les dépendances dans la commande bootstrap comme:
C'est du moins ce qui a fonctionné pour moi en alpha40.
c'est le lien: http://www.syntaxsuccess.com/viewarticle/dependency-injection-in-angular-2.0
la source
Bonjour, vous pouvez utiliser ceci dans votre fichier .ts:
Importez d'abord votre service dans ce fichier .ts:
Ensuite, dans le même fichier, vous pouvez ajouter
providers: [Your_Service_Name]
:la source
Ajoutez-le aux fournisseurs non injectables
la source
Dans Angular, vous pouvez enregistrer un service de deux manières:
1. Enregistrer un service dans le module ou le composant racine
Effets:
Vous devez faire attention si vous enregistrez un service dans un module chargé paresseusement:
Le service est disponible uniquement dans les composants déclarés dans ce module
Le service sera disponible sur l'application à vie uniquement lorsque le module est chargé
2. Enregistrez un service dans tout autre composant d'application
Effets:
Vous devez faire attention si vous enregistrez un service dans un autre composant d'application
L'instance du service injecté sera disponible uniquement dans le composant et tous ses enfants.
L'instance sera disponible sur la durée de vie du composant.
la source
Vous devez l'ajouter au tableau des fournisseurs, qui inclut toutes les dépendances de votre composant.
Regardez cette section dans la documentation angulaire:
Donc, dans votre cas, changez simplement les injectables en fournisseurs comme ci-dessous:
Également dans les nouvelles versions d'Angular, @View et d'autres éléments disparus.
Pour plus d'informations, visitez ici .
la source
ajoutez votre service au tableau de fournisseurs [] dans le fichier app.module.ts. Comme ci-dessous
// ici mon service est CarService
app.module.ts
la source
Angular2 vous oblige à déclarer tous les injectables dans l'appel de fonction bootstrap. Sans cela, votre service n'est pas un objet injectable.
la source
providers
tableau dans l'objet de configuration du composant. S'il est inclus dans leproviders
tableau, nous obtenons une instance par composant lié. Consultez le document Injecteurs hiérarchiques pour plus d'informations.Ajoutez @Injectable à votre service en tant que:
et dans votre composant, ajoutez les fournisseurs en tant que:
ou si vous souhaitez accéder à votre service dans toute l'application, vous pouvez passer au fournisseur d'application
la source
Enregistrement de fournisseurs dans un composant
Voici un HeroesComponent révisé qui enregistre le HeroService dans son tableau de fournisseurs.
la source