Angulaire à 2 Pas de fournisseur de Service
J'ai essayé de résoudre un problème étrange avec angulaire 2 où il ne dtecte pas mon fournisseur de déclaration, mais rien ne fonctionne. Je ne peux même pas le reproduire dans plunkr.
Je suis en utilisant angulaire 2 rc 3 avec routeur 3.0 alpha.8.
Message d'erreur est: ORIGINAL EXCEPTION: No provider for TestService!
app.les itinéraires.ts:
import { provideRouter, RouterConfig } from '@angular/router';
import { HomeComponent } from './app/home/home.component';
import { LogInComponent } from './app/log-in/log-in.component';
import { SignUpComponent } from './app/sign-up/sign-up.component';
export const routes: RouterConfig = [
{ path: '', component: HomeComponent },
{ path: 'log-in', component: LogInComponent },
{ path: 'sign-up', component: SignUpComponent }
];
export const APP_ROUTER_PROVIDERS = [
provideRouter(routes)
];
principal.ts:
import { bootstrap } from '@angular/platform-browser-dynamic';
import { enableProdMode } from "@angular/core";
import { AppComponent } from './app/app.component';
import { APP_ROUTER_PROVIDERS } from './app.routes';
//enableProdMode();
bootstrap(AppComponent, [
APP_ROUTER_PROVIDERS
])
.catch(error => console.log(error));
app/app.composante.ts:
import { Component } from '@angular/core';
import { ROUTER_DIRECTIVES } from '@angular/router';
import { TestService } from './shared/test.service';
@Component({
selector: 'my-app',
template: `
<div id="menu">
<a [routerLink]="['/sign-up']"><button>Sign Up</button></a>
</div>
<router-outlet></router-outlet>
`,
directives: [ROUTER_DIRECTIVES],
providers: [TestService]
})
export class AppComponent {
constructor() { }
}
app/inscrivez-vous/inscrivez-vous.composante.ts:
import { Component } from '@angular/core';
import { ROUTER_DIRECTIVES } from '@angular/router';
import { TestService } from '../shared/test.service';
@Component({
selector: 'sign-up',
template: `<h1>Sign up!</h1>`,
directives: [ROUTER_DIRECTIVES]
})
export class SignUpComponent {
constructor(private testService: TestService) {
this.testService.test('works?');
}
}
app/shared/test.service.ts:
import { Injectable } from '@angular/core';
@Injectable()
export class TestService {
constructor() { }
test(message: string) {
console.log(message);
}
}
Donc, je suis en fournissant les testservice dans le composant de base (app.composante.ts) parce que je veux que tous mes composants pour accéder à la même instance. Cependant, lorsque je navigue à signer-up, j'ai pas de fournisseur pour testservice erreur. Si j'ai la TestService dans le composant, cela fonctionne alors:
import { Component, OnInit } from '@angular/core';
import { ROUTER_DIRECTIVES } from '@angular/router';
import { TestService } from '../shared/test.service';
@Component({
selector: 'sign-up',
template: `<h1>Sign up!</h1>`,
directives: [ROUTER_DIRECTIVES],
providers: [TestService]
})
export class SignUpComponent implements OnInit {
constructor(private testService: TestService) { }
ngOnInit() { }
}
Cependant, j'ai besoin de la même instance accessible tout au long de mon application, alors comment puis-je injecter ce à la principale composante de niveau?
J'ai même essayé de reproduire cette application au niveau de la fourniture de services avec plunkr avec la même version de tout, mais il ne semble pas me donner la même erreur...
http://plnkr.co/edit/5bpeHs72NrlyUITCAJim?p=preview
Ce config, pensez-vous être suspect? Je peux poster mon systemjs config si ça peut aider
Je ne sais pas beaucoup sur systemjs, parce que je suis seulement en utilisant Dart localement. Je vais essayer de créer un nouveau projet avec angulaires-cli et de copier le code de bits pour voir si vous obtenez la même erreur.
Vous pouvez poster une réponse à votre propre question. Ensuite, vous pouvez l'accepter (après 2 jours de refroidissement de la phase) dont les résultats à cette question étant marqué comme réponse.
OriginalL'auteur Daynil | 2016-06-28
Vous devez vous connecter pour publier un commentaire.
Injecter quelque chose sur le
app
niveau se fait dansbootstrap
:main.ts
:angulaire.io/docs/ts/latest/api/plate-forme-navigateur-dynamique/index/.... Vérifier
Class export
. Il ditcustomProviders
. Il permet à tout@Injectable
.Essayez d'ajouter
providers: [TestService]
enSignUpComponent
Ouais, elle est autorisée à fournir dans le bootstrap, mais pas préféré. C'est à côté de la question, bien que depuis il ne fonctionne toujours pas. En outre, l'ajout des fournisseurs dans le signe du volet fonctionne, mais je ne peux pas utiliser la même référence dans mes autres composants.
Pour les services global fournissant à la racine de la composante est la méthode préférée selon l'Angular2 guide de style. Le nouveau routeur doit être fourni avec bootstrap en raison de certaines de dépendance avec
APP_INITIALIZER
mais sinonbootstrap()
et de la racine de la composante sont à peu près équivalents.OriginalL'auteur Andrei Zhytkevich
Pour moi, quelques références aux "services" du dossier ont été "Services". Lorsque j'ai fait tous les "services" (en minuscules), il a travaillé.
Par exemple:
ne fonctionne pas, mais cela a fonctionné:
OriginalL'auteur Clay Lenhart
À Tous les futurs lecteurs - et c'est correct angulaire 2.0.0 rc-4:
assurez-vous que vous suivez les dessous de la structure de dossier:
C'est crucial pour la hiérarchie de l'injection de bien portée et d'identifier les fournisseurs.
Aussi, et c'est très important - si le problème persiste et que vous utilisez la Machine ou de tout autre transpiled langue - supprimer les artefacts qui votre transpiler produit pour chaque classe associée à la problématique de l'objet graphique - ce, et l'OP réponse finalement aidé dans mon cas (*.map.js et *.js fichiers supprimés et re-transpiled).
mmm. Pensé qu'Il l'aide, mais quand même ...chat.stackoverflow.com/rooms/140220/...
OriginalL'auteur Eyal Perry
C'était un problème de configuration après tout, et complètement insaisissable.
Par l'ang2 guide de style, j'ai eu mon principal.ts un dossier vers le haut à partir de mon application principale du dossier, et en
systemjs.config
je devais déclarer la principale pour l'application de'../main.js'
. Quand j'ai déplacé le fichier principal à la racine du dossier app et changé la déclaration du package dans systemjs à'main.js'
il a travaillé.Qui est bizarre tout le reste fonctionne, droit jusqu'à ce que j'essaie d'utiliser l'injection de dépendance hiérarchique.
OriginalL'auteur Daynil