網站搜尋

angular - 如何更新依賴注入令牌的值


Angular 的依賴注入讓你可以使用一個標記來注入字串、函數或物件,而不是使用服務類別。

我在我的模組中這樣聲明它:

providers: [{ provide: MyValueToken, useValue: 'my title value'}]

我用它的方法是這樣的:

constructor(@Inject(MyValueToken) my_value: string) {
  this.title = my_value;
}

但是,我如何才能從這個組件更新值,並讓其他組件每次都能獲取新的值呢?換句話說,我想模擬使用類似 BehaviorSubject 的功能來發出和接收值。

如果這不可能,那麼那些注入令牌的值有什麼用處呢?如果它們只提供靜態數據,我完全可以直接在我的組件中聲明這個靜態值並直接使用它。

答案#1

你可以使用 BehaviorSubject 而不是不可變的原始值,然後在一個元件中存取和更新它,並在另一個元件中訂閱它:

export const MY_VALUE_TOKEN = new InjectionToken<BehaviorSubject<string>>('my.Value.token')
providers: [{ provide: MY_VALUE_TOKEN, useValue: new BehaviorSubject('')}]
    
// consumer
constructor(@Inject(MY_VALUE_TOKEN) my_value: BehaviorSubject<string>) {
  my_value.subscribe((my_value)=>this.title = my_value);
}

// producer
constructor(@Inject(MY_VALUE_TOKEN) my_value: BehaviorSubject<string>) {
  my_value.next('my title value');
}

答案#2

除了巫師之外:

如果你有一個使用案例,每個消費者都需要自己的 BehaviourSubject 實例。(我碰巧就在這個使用案例中)。確保你定義一個工廠。

const myFactory = () => { return new BehaviorSubject<string>('') };

providers: [
    { provide: MyValueToken, useFactory: myFactory }
]

// Then, as proposed in the top-answer.

// consumer
constructor(@Inject(MyValueToken) my_value: BehaviorSubject) {
  my_value.subscribe((my_value)=>this.title = my_value);
}

// producer
constructor(@Inject(MyValueToken) my_value: BehaviorSubject) {
  my_value.next('my title value');
}