Generally we get one service instance per the whole application.
It is also possible to create an instance of service per component or directive.
@Component({
selector: 'provide',
template: '<ng-content></ng-content>',
providers: [ Service ]
})
export class ProvideComponent {}
@Directive({
selector: '[provide]',
providers: [ Service ]
})
export class ProvideDirective {}
file:app.component.ts
import { Injectable, Component, OnInit, OnDestroy, Host } from '@angular/core';
@Injectable()
export class ItemsLinker implements OnDestroy {
private links: Set<ItemComponent> = new Set();
link(item: ItemComponent) {
this.links.add(item);
}
unlink(item: ItemComponent) {
this.links.delete(item);
}
ngOnDestroy() {
this.links.clear();
}
}
@Component({
selector: 'item',
template: '<ng-content></ng-content>'
})
export class ItemComponent implements OnInit, OnDestroy {
constructor(@Host() private linker: ItemsLinker) {}
ngOnInit() {
this.linker.link(this);
}
ngOnDestroy() {
this.linker.unlink(this);
}
}
@Component({
selector: 'items',
template: '<ng-content></ng-content>',
providers: [ ItemsLinker ]
})
export class ItemsComponent {}
@Component({
selector: 'my-app',
template: `
<items>
<item>🦊</item>
<item>🦄</item>
<item>🐉</item>
</items>
`
})
export class AppComponent {}
file:app.module.ts
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { AppComponent, ItemsComponent, ItemComponent } from './app.component';
@NgModule({
imports: [BrowserModule],
declarations: [
AppComponent,
ItemsComponent,
ItemComponent
],
bootstrap: [AppComponent]
})
export class AppModule {}
翻译自:https://www.30secondsofcode.org/angular/s/component-level-providers