我在AppModule中有一个提供程序,它提供了一个类。
有没有办法在运行时更新提供的值?
{provide: MatDatepickerIntl, useClass: SomeClass}
如何在运行时(即:对组件中的事件做出反应时(用AnotherClass替换SomeClass。
我正在使用Angular 9。
编辑
我知道可以使用useFactory基于某些逻辑生成所提供的值。这种方法的问题是,在创建组件时,工厂函数仍然只运行一次。
我想做的是每当某个事件发生时再次运行该函数。我该怎么做?
第2版:
所以app.module这样做:
// this is in providers array...
{
provide: MatDatepickerIntl, deps: [DatePickerIntlService],
useFactory: (datePickerIntl) => datePickerIntl.getLocale()
}
上面的服务读取当前区域设置,并相应地返回一个MatDatepickerIntl子类实例,因此它创建了正确的类。
最后,我有应用程序组件ngOnInit:中的事件
onLangChange.subscribe(() => {
})
如何更改事件处理程序中提供的MatDatepickerIntl子类?我可以调用该服务,但无法用结果更新提供的值。。。
Material Date Picker需要MatDatepickerIntl令牌返回所需的子类。这就是它加载本地化文本的方式。
希望这能更好地澄清问题。
提前感谢!
您必须创建一个父服务,它将重新路由到预期的服务:
@Injectable({
providedIn: 'root'
})
export class MyParentService {
childService: ChildEnService | ChildFrService | ChildEsService;
private ngDestroy$: Subject<void> = new Subject();
constructor(private childEnService: ChildEnService,
private childFrService: ChildFrService,
private childEsService: ChildEsService,
private languageObsService: LanguageObsService) {
this.languageObsService.getCurrentLanguage().pipe(
takeUntil(this.ngDestroy$)
).subscribe(
newLanguage => this.updateChild(newLanguage);
);
}
public getMyPreciousData() {
return this.childService?.getMyPreciousData();
}
private updateChild(newLanguage: LanguageEnum) {
swtich(newLanguage) {
case LanguageEnum.en:
this.childService = this.childEnService;
break;
case LanguageEnum.fr:
this.childService = this.childFrService;
break;
case LanguageEnum.es:
this.childService = this.childEsService;
break;
}
}
private ngOnDestroy() {
// unsubscribe the languageObsService
this.ngDestroy$.next();
this.ngDestroy$.complete();
}
}
@Injectable({
providedIn: 'root'
})
export class LanguageObsService{
currentLanguage$: BehaviorSubject<LanguageEnum> = new BehaviorSubject(LanguageEnum.en);
constructor() {}
public getCurrentLanguage(): Observable<LanguageEnum> {
return this.currentLanguage$.asObservable();
}
public setCurrentLanguage(newLanguage: LanguageEnum): void {
this.currentLanguage$.next(newLanguage);
}
}