=====Опциональные сервисы===== Сервис может быть опциональным, необязательным. Например, в прошлой теме был создан сервис LogService:\\ export class LogService{ write(logMessage:string){ console.log(logMessage); } } И был другой сервис DataService, который использовал LogService: import {Injectable} from '@angular/core'; import {LogService} from './log.service'; @Injectable() export class DataService{ private data: string[] = [ "Apple iPhone XR", "Samsung Galaxy S9", "Nokia 9"]; constructor(private logService: LogService){} getData(): string[] { this.logService.write("операция получения данных"); return this.data; } addData(name: string){ this.data.push(name); this.logService.write("операция добавления данных"); } } Допустим, по какой-то причине сервис LogService не доступен для инжектирования, например, мы не добавили в провайдеры компонента AppComponent: import { Component} from '@angular/core'; import {DataService} from './data.service'; @Component({ selector: 'my-app', template: `
{{item}}
`, providers: [DataService] // Добавлен только сервис DataService }) export class AppComponent{ newItem: string; items: string[] = []; constructor(private dataService: DataService){} addItem(name: string){ this.dataService.addData(name); } ngOnInit(){ this.items = this.dataService.getData(); } }
Если мы запустим приложение, то в этом случае мы получим ошибку. Так как для сервиса LogService не определен провайдер. В этом случае мы можем определить сервис LogService как опциональный, применяя декоратор **Optional**. Для этого изменим код //DataService//: import {Injectable, Optional} from '@angular/core'; import {LogService} from './log.service'; @Injectable() export class DataService{ private data: string[] = [ "Apple iPhone XR", "Samsung Galaxy S9", "Nokia 9"]; constructor(@Optional() private logService: LogService){} getData(): string[] { if (this.logService) this.logService.write("операция получения данных"); return this.data; } addData(name: string){ this.data.push(name); if (this.logService) this.logService.write("операция добавления данных"); } } Итак, в конструкторе класса мы получаем сервис как опциональный: constructor(@Optional() private logService: LogService){} Далее при обращении к сервису мы можем проверить, установлен ли он, и если он установлен, использовать его: if (this.logService) this.logService.write("операция получения данных");