=====сервис для всех компонентов=====
Вполне возможно, что в нашем приложении будет несколько различных компонентов, которые используют сервисы. При этом компоненты могут использовать одни и те же сервисы. Например, в прошлых темах был создан сервис DataService, который управляет данными. Определим специальный компонент для работы с данными. Для этого возьмем проект из прошлой темы и добавим в папку %%src/app%% новый файл **data.component.ts:**\\
\\
{{:angular:angular2:services:4.6.png|}}
\\
Определим в этом файле следующий код:
import { Component} from '@angular/core';
import {DataService} from './data.service';
import {LogService} from './log.service';
@Component({
selector: 'data-comp',
template: ``,
providers: [DataService, LogService]
})
export class DataComponent{
newItem : string;
items: string[] = [];
constructor(private dataService: DataService){}
addItem(name: string){
this.dataService.addData(name);
}
ngOnInit(){
this.items = this.dataService.getData();
}
}
DataComponent загружает и добавляет данные. Для работы с сервисами декоратор Component определяет секцию providers:
providers: [DataService, LogService]
Используем этот компонент DataComponent в главном компоненте приложения AppComponent:
import { Component} from '@angular/core';
@Component({
selector: 'my-app',
template: `
`
})
export class AppComponent {}
Этот компонент через элемент ''data-comp'' вызывает компонент DataComponent. Причем вызывает два раза. То есть для обработки каждого элемента будет создаваться свой объект DataComponent.\\
\\
И соответственно изменим главный модуль приложения AppModule:
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { FormsModule } from '@angular/forms';
import { AppComponent } from './app.component';
import { DataComponent } from './data.component';
@NgModule({
imports: [ BrowserModule, FormsModule ],
declarations: [ AppComponent, DataComponent],
bootstrap: [ AppComponent ]
})
export class AppModule { }
Теперь запустим приложение и попробуем добавить новый элемент:\\
\\
{{ :angular:angular2:services:4.3.png |}}
\\
Как видно на скриншоте, при добавлении в одном компоненте новый элемент будет добавляться только для этого компонента. Потому что у нас два отдельных компонента, и для каждого из них будет создаваться свой набор сервисов DataService и LogService.\\
\\
Такое поведение не всегда может быть предпочтительным. Возможно, потребуется, чтобы компоненты использовали один и тот же объект сервиса, вместо создания разных сервисов для каждого компонента. Для этого мы можем зарегистрировать все сервисы не в компоненте, а в главном модуле приложения AppModule:\\
\\
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { FormsModule } from '@angular/forms';
import { AppComponent } from './app.component';
import { DataComponent } from './data.component';
import {DataService} from './data.service';
import {LogService} from './log.service';
@NgModule({
imports: [ BrowserModule, FormsModule ],
declarations: [ AppComponent, DataComponent],
providers: [DataService, LogService], // регистрация сервисов
bootstrap: [ AppComponent ]
})
export class AppModule { }
В этом случае мы уже можем убрать регистрацию сервисов из компонента DataComponent:
import { Component} from '@angular/core';
import {DataService} from './data.service';
@Component({
selector: 'data-comp',
template: ``
})
export class DataComponent{
newItem: string;
items: string[] = [];
constructor(private dataService: DataService){}
addItem(name: string){
this.dataService.addData(name);
}
ngOnInit(){
this.items = this.dataService.getData();
}
}
После этого оба объекта DataComponent будут использовать один и тот же сервис DataService. Поэтому добавление объекта в одном компоненте автоматически отразится и на другом:\\
\\
{{ :angular:angular2:services:4.4.png |}}