Должен ли быть код в конструкторе @NgModule, и если да, то по каким причинам?

Это можно сделать, и код запускается при загрузке модуля:

import { NgModule } from '@angular /core';

@NgModule({...})
export class SomeNgModule {
  constructor(providedService: ProvidedService) {
        providerService.iCanDoThis('?');
  }
}

Но если я хочу инициализировать код, не должен ли я использовать APP_INITIALIZER или какой-то другой хук?

Я не могу найти вескую причину, когда это полезно и как это может быть полезно.

Вероятно, другим хорошим вопросом будет: Когда этот код будет выполняться во время жизни приложения Angular?


person jonyeezs    schedule 18.03.2019    source источник
comment
код будет выполнен при загрузке модуля. проверьте этот аналогичный вопрос: stackoverflow.com/questions/47094998/   -  person Joel Joseph    schedule 18.03.2019
comment
Чтобы ответить на мой второстепенный вопрос: bennadel.com/blog/. Хотя довольно старая версия, но я думаю, что она все еще работает так же (?)   -  person jonyeezs    schedule 18.03.2019


Ответы (1)


Я использую этот способ внедрения в этом сценарии, когда я хочу использовать службу Angular в своем пользовательском классе, но я не могу внедрить ее непосредственно в конструктор. Поэтому мне нужен экземпляр Injector.

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

export let InjectorInstance: Injector;


@NgModule({
  /* *** */
})
export class FeatureModule {
  constructor(private injector: Injector) {
    InjectorInstance = this.injector;
  }
}

А затем используйте его в своих пользовательских классах для внедрения сервисов Angular следующим образом:

import {InjectorInstance} from 'pat-to-feature-module';


export class MyCustomClass{

  getHttpService = () => {
    return InjectorInstance.get<HttpClient>(HttpClient);
  };
}

Таким образом, я уверен, что использую (внедряю) сервисы, созданные Angular. Возможно, есть другие способы использования этой функции.

person Harun Yilmaz    schedule 18.03.2019
comment
Почему бы не превратить MyCustomClass в сервис Angular и позволить DI обрабатывать HttpClient? Хм, может быть, я никогда не сталкивался с ситуацией, когда это потребовалось бы созданному классу. - person jonyeezs; 18.03.2019
comment
Допустим, у меня есть более 30 пользовательских классов, которые являются сущностями. (Пользователь, Токен, Продукт, Клиент и т. д.). Затем мне нужно иметь возможность сопоставлять ответы API с этими классами. Так что я не хочу, чтобы они были услугами (инъекционными), поскольку я их не инъекирую. Как я уже сказал, я не уверен, что это самый правильный способ сделать это, но он действительно соответствует моим потребностям в этом контексте. - person Harun Yilmaz; 18.03.2019