Как передать токен инъекции во вложенную службу с использованием подхода 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.