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