I've got a problem loading a class into an Angular component. I've been trying to solve it for a long time; I've even tried joining it all in a single file. What I have is:
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; } }
I keep getting an error message saying No provider for NameService
.
Can someone help me spot the issue with my code?
@nathanhleung it seems like providers made it's way into the release also. In Angular 2 there are three places you can "provide" services: "The bootstrap provider option is intended for configuring and overriding Angular's own preregistered services, such as its routing support."
If you only want one instance of NameService across your entire app (i.e., Singleton), then include it in the providers array of your root component: @Component ( { providers: [NameService], ... )} export class AppComponent { ... }
On the other hand, a provider registered in an application component is available only on that component and all its children. Here, the APP_CONFIG service needs to be available all across the application, so it's registered in the AppModule @NgModule providers array.
The service itself is a class that the CLI generated and that's decorated with @Injectable (). By default, this decorator has a providedIn property, which creates a provider for the service. In this case, providedIn: 'root' specifies that Angular should provide the service in the root injector.
You have to use providers
instead of injectables
@Component({ selector: 'my-app', providers: [NameService] })
Complete code sample here.
In Angular 2 there are three places you can "provide" services:
"The bootstrap provider option is intended for configuring and overriding Angular's own preregistered services, such as its routing support." -- reference
If you only want one instance of NameService across your entire app (i.e., Singleton), then include it in the providers
array of your root component:
@Component({ providers: [NameService], ... )} export class AppComponent { ... }
Plunker
If you would rather have one instance per component, use the providers
array in the component's configuration object instead:
@Component({ providers: [NameService], ... )} export class SomeOtherComponentOrDirective { ... }
See the Hierarchical Injectors doc for more info.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With