Сервисы в Angular представляют довольно широкий спектр классов, которые выполняют некоторые специфические задачи, например, логгирование, работу с данными и т.д.
В отличие от компонентов и директив сервисы не работают с представлениями, то есть с разметкой html, не оказывают на нее прямого влияния. Они выполняют строго определенную и достаточно узкую задачу.
Стандартные задачи сервисов:
Допустим, у нас есть следующая базовая структура проекта:
Добавим в папку 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: `<div class="panel"> <div><input [(ngModel)]="name" placeholder = "Модель" /> <button (click)="addItem(name)">Добавить</button> </div> <table> <tr *ngFor="let item of items"> <td>{{item}}</td> </tr> </table> </div>`, 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 { }
В итоге мы сможем и выводить данные и добавлять новые элементы через сервис: