angular - 如何更新 Angular 中提供者提供的值?

标签 angular dynamic angular-providers

我在 AppModule 中有一个提供类的提供者。

有没有办法在运行时更新提供的值?

{provide: MatDatepickerIntl, useClass: SomeClass}

如何在运行时用 AnotherClass 替换 SomeClass(即:当对组件中的事件使用react时)。

我正在使用 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 token 返回所需的子类。这就是它加载本地化文本的方式。

希望这能更好地澄清事情。

提前致谢!

最佳答案

你必须创建一个父服务,它将重新路由到预期的服务:

@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);
  }
}

关于angular - 如何更新 Angular 中提供者提供的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63289440/

相关文章:

angular - Angular 中的 Twitter API Request_Token

javascript - Angular:日期时区全局参数设置

javascript - 从 2 个 observables 获取一次数据

c - 为什么我的指针数组在动态分配后被覆盖?

python - 动态设置局部变量

javascript - Angular 2中没有路由器提供者

javascript - Angular 中不同类型的提供者配置

Angular 将值绑定(bind)到指令参数

css - 如何设置 jquery ui Dialog minwidth 但如果可能的话让它变大?