Angular Injectror - PullRequest
       26

Angular Injectror

0 голосов
/ 04 августа 2020

У меня есть несколько компонентов; Я использую Injector в конструкторе для инкапсуляции

import { Component, Injector, OnInit } from '@angular/core';

@Component({
  selector: 'app-base',
  templateUrl: './base.component.html',
  styleUrls: ['./base.component.css'],
})
export class BaseComponent implements OnInit {
  some = '';

  constructor(injector: Injector) {
    this.some = injector.get(this.some);
  }

  ngOnInit(): void {}
}

Я использую BaseComponent в другом компоненте

import { BaseComponent } from '../base/base.component';

@Component({
  selector: 'app-base-state',
  templateUrl: './base-state.component.html',
  styleUrls: ['./base-state.component.css'],
})
export class BaseStateComponent extends BaseComponent implements OnInit {
  constructor(injector: Injector) {
    super(injector);
  }

  ngOnInit(): void {}
}

BaseStateComponent Я собираюсь использовать в других компонентах; Вопрос: есть ли способ сделать инжектор в BaseComponent или BaseSateComponent необязательным; У меня есть случай, когда мне нужен компонент, но мне не нужен его инжектор;

Я знаю о функции

constructor(@Optional(), @Self() etc...); 

Но, честно говоря, я не могу понять, как это работает; Буду признателен, если кто-нибудь объяснит Декораторы;

стек

1 Ответ

1 голос
/ 04 августа 2020

Проблема в том, что вы хотите использовать @ Optional @ Self , чтобы сделать инжектор необязательным . Но @ optional @ self хорошо работает с чем-то, что является injectable , которое вы можете предоставить в массиве Provider на каком-то уровне. В Angular услуги инъекционные . Таким образом, вы можете использовать @ Optional @Self @ SkipSelf со службами или чем-то вводимым

Когда вы используете constrocutor (private someService: SomeService) , Angular проверит, будет ли SomeService предоставляется на уровне компонентов означает в @ component провайдерах , если нет, предоставляется на уровне модуля , если нет, то предоставляется ли на Root уровне ? Таким образом, angular проверяет все дерево инжекторов .

Когда вы используете @ Optional , эта проверка и т. Д. Не выполняется ....

Имейте в виду, что Injector преобразует токен в зависимость .

Ответьте на ваш вопрос

Вы можете использовать необязательный параметр в машинописном тексте, просто поставив ? пометку рядом с параметром, как показано ниже,

export class BaseComponent implements OnInit {
  some = '';

  constructor(private injector?: Injector) {             // ? to make parameter optional
    this.some = injector.get(this.some);
  }

  ngOnInit(): void {}
}

it также имеет смысл, потому что вы используете ООП вместо классов.

Forked Stackblitz (Также исправлены некоторые другие проблемы)

...