=====Сервисы и dependency injection Сервисы=====
Сервисы в Angular представляют довольно широкий спектр классов, которые выполняют некоторые специфические задачи, например, логгирование, работу с данными и т.д.\\
\\
В отличие от компонентов и директив сервисы не работают с представлениями, то есть с разметкой html, не оказывают на нее прямого влияния. Они выполняют строго определенную и достаточно узкую задачу.\\
\\
Стандартные задачи сервисов:\\
* Предоставление данных приложению. Сервис может сам хранить данные в памяти, либо для получения данных может обращаться к какому-нибудь источнику данных, например, к серверу.
* Сервис может представлять канал взаимодействия между отдельными компонентами приложения
* Сервис может инкапсулировать бизнес-логику, различные вычислительные задачи, задачи по логгированию, которые лучше выносить из компонентов. Тем самым код компонентов будет сосредоточен непосредственно на работе с представлением. Кроме того, тем самым мы также можем решить проблему повторения кода, если нам потребуется выполнить одну и ту же задачу в разных компонентах и классах
Допустим, у нас есть следующая базовая структура проекта:\\
\\
{{:angular:angular2:services:4.5.png|}}
\\
Добавим в папку %%src/app%% новый файл **data.service.ts**. Этот файл будет содержать код сервиса. Согласно условностям в названии файла после названия самого сервиса должна идти подстрока .service. Если название сервиса состоит из нескольких слов, которые начинаются с большой буквы, то в названии файла все эти слова пишутся с маленькой буквы и разделяются дефисами. Например, если сервис называется ''SpecialSuperHeroService'', то файл сервиса будет называться ''special-super-hero.service.ts''.\\
\\
Определим в этом файле следующий сервис:
export class DataService{
private data: string[] = [ "Apple iPhone XR", "Samsung Galaxy S9", "Nokia 9"];
getData(): string[] {
return this.data;
}
addData(name: string){
this.data.push(name);
}
}
В сервисе определен массив данных и методы для работы с ним. В реальном приложении эти данные можно получать с сервера или из какого-либо внешнего хранилища.\\
\\
Теперь определим код компонента:
import { Component} from '@angular/core';
import {DataService} from './data.service';
@Component({
selector: 'my-app',
template: ``,
providers: [DataService]
})
export class AppComponent{
items: string[] = [];
name: string;
constructor(private dataService: DataService){}
addItem(name: string){
this.dataService.addData(name);
}
ngOnInit(){
this.items = this.dataService.getData();
}
}
Чтобы задействовать сервис в компоненте, его не только надо импортировать:
import {DataService} from './data.service';
Но также необходимо его добавить в коллекцию providers компонента:
providers: [DataService]
Все используемые сервисы добавляются в коллекцию providers. Тем самым определяется провайдер сервиса, который будет использоваться для его получения. И после этого мы сможем задействовать встроенный в Angular механизм dependency injection и получить объект сервиса в конструкторе компонента и затем использовать по необходимости:
constructor(private dataService: DataService){}
Для загрузки данных реализуется метод ''ngOnInit()'' интерфейса OnInit, который вызывается после конструктора.\\
\\
И так как мы используем директиву ngModel для работы с элементами формы, то нам надо подключить модуль FormsModule в файле app.module.ts:
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { FormsModule } from '@angular/forms';
import { AppComponent } from './app.component';
@NgModule({
imports: [ BrowserModule, FormsModule],
declarations: [ AppComponent],
bootstrap: [ AppComponent ]
})
export class AppModule { }
В итоге мы сможем и выводить данные и добавлять новые элементы через сервис:\\
\\
{{ :angular:angular2:services:4.1.png |}}