@zlodiak

Зачем использовать провайдер в компоненте?

Как известно, чтобы в angular инжектировать неокторый класс в другой класс необходимо использовать приблизительно такой подход:

import { Component } from '@angular/core';
import { HeroServiceProvider } from './hero.service.provider';

@Component({
  selector: 'app-heroes',
  providers: [ HeroServiceProvider ],
  template: `
    <h2>Heroes</h2>
    <app-hero-list></app-hero-list>
  `
})
export class HeroesComponent {
    constructor(private heroServiceProvider: HeroServiceProvider);
}

Здесь важны 3 момента:

  1. должен присутствовать импорт
  2. импортируемый класс нужно прописать в массиве providers
  3. в конструкторе при помощи простейшего синтаксического сахара присвоить объект инжектируемого класса локальной переменной компонента.


Объясните пожалуйста зачем в этой цепочке нужен пункт 2? То есть понятно, что если не помещать инжектируемый класс в массив providers, то фреймворк выбросит исключение, но хотелось бы понять сам смысл этого помещения.

Почему бы разработчикам фреймворка не сделать так чтобы программисты после импорта инжектируемого класса сразу отдавали бы его через конструктор локальной переменной компонента?
  • Вопрос задан
  • 110 просмотров
Решения вопроса 1
Xuxicheta
@Xuxicheta Куратор тега Angular
инженер
1. импорт ничего не значит. Это просто получение ссылки в текущую область видимости. Этим занимается вебпак.
2. providers - указание инжектору, что он должен знать вот о таких сущностях. В данном случае для локального инжектора, к которому имеет доступ текущий компонент и его вложенные.
Этот инжектор создается перед созданием компонента и умирает после. Также, при умирании будет вызван хук ngOnDestroy у всех инстансов провайдеров в этом инжекторе.
3. Указывая в конструкторе тип, мы сообщаем инжектору какие данные мы хотим получить (тут HeroServiceProvider это токен, т.к. указатель), перед тем как создать эксземпляр класса, а конкретно HeroesComponent.
Инжектор смотрит есть ли у него такие, а если нет, то создает и передает в конструктор. Инстанс HeroServiceProvider будет создан и виден только в HeroesComponent или его вложенных.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
mmmaaak
@mmmaaak
Ответ написан
Комментировать
@KingstonKMS
Импорт провайдера в файл равным счётом ничего не значит. Указывать провайдеры в параметрах декоратора необходимо для правильного построения зависимостей всего проекта.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы