Как передать токен инъекции во вложенную службу с использованием подхода SCAM (однокомпонентный угловой модуль)?

Я играл с подходом SCAM (Single Component Angular Modules), и я столкнулся с проблемой передачи токена инъекции от родительского к дочернему модулю.

У меня есть ScamService с введенными httpClient и baseUrl :

      import { HttpClient, HttpClientModule } from '@angular/common/http';
import { Injectable, Inject, NgModule, ModuleWithProviders } from '@angular/core';
import { BASE_URL } from './injection.tokens';

@Injectable()
export class ScamService {
  constructor( @Inject(BASE_URL) private baseUrl, private httpClient: HttpClient ) {}

  public getData() {
    return this.httpClient.get(`${this.baseUrl}/rest-of-endpoint`);
  }
}

@NgModule({
  imports: [HttpClientModule]
})
export class ScamServiceModule {
  public static forRoot(baseUrl): ModuleWithProviders<ScamServiceModule> {
    return {
      ngModule: ScamServiceModule,
      providers: [{
          provide: BASE_URL,
          useValue: baseUrl
      }]
    };
  }
}

Чтобы предоставить токен BASE_URL модулю, мне нужно создать статический метод, который возвращает ModuleWithProviders . Там я могу присвоить токену значение. Это хорошо.

Затем я хочу использовать службу в компоненте, поэтому я импортирую ScamServiceModule в ScamComponentModule :

      import { Component, ModuleWithProviders, NgModule } from '@angular/core';
import { ScamService, ScamServiceModule } from './scam.service';

@Component({//...})
export class ScamComponent {
  constructor(private scamService: ScamService) {}
}

@NgModule({
  imports: [
    ScamServiceModule.forRoot(
      `The url I would like to pass is not in the environments, 
       I need to take it from forRoot of ScamComponentModule`
    )
  ]
})
export class ScamComponentModule {
  public static forRoot(baseUrl): ModuleWithProviders<ScamComponentModule> {
    // how to tell ScamServiceModule what the value of baseUrl is?
  }
}

Теперь мне нужно указать ему базовый URL. Поэтому я должен вызвать ScamServiceModule.forRoot ('some-url') . Было бы хорошо, если бы я знал URL-адрес на уровне компонентов.

Но гиперссылка должна быть пропущена через forRoot метод ScamComponentModule .

У вас есть предложения, как передать baseUrl?

Заранее спасибо!

1 ответ

Проблема не имеет ничего общего с СКАМ-подходом.

Речь идет только о предоставлении зависимостей. Решение проблемы - использовать свойство deps вместе с provide и useValue в массиве Angular Providers.

Другие вопросы по тегам