2

角依賴注入讓你注入一個字符串,函數,或者使用令牌,而不是服務類對象。如何更新依賴注入令牌值

我宣佈它在我的模塊中是這樣的:

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

,我使用它是這樣的:

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

但是,我怎麼可以更新該組件的價值,並讓其他成分得到每次新的價值?換句話說,我想模擬使用諸如BehaviorSubject之類的東西來發射和接收值的功能。

如果這是不可能的,那麼有什麼用那些注射標記值的,如果他們只提供靜態數據,而不是我可以簡單地聲明在我的組件的靜態值,並直接使用它。

+1

是的,你可以聲明靜態值,如果它是隻用於你應該*的一個地方。當在多個地方使用DI並且您希望保持一致性並且希望爲測試注入替代值時,DI非常有用。如果兩者都不是這樣,不要增加複雜性 - 僅僅因爲你可以,並不意味着你應該這樣做。我建議閱讀https://angular.io/guide/dependency-injection-in-action。 – jonrsharpe

+0

@jonsharpe偉大的答案只是重點!謝謝:) –

回答

2

取而代之的是原始這是不可改變的,你可以使用一個BehaviorSubject,然後訪問和在一個組件更新並訂閱中的其他:

providers: [{ provide: MyValueToken, useValue: new BehaviorSubject('')}] 

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

這與聲明服務類和使用BehaviorSubject有何不同。我覺得所有這些角度依賴注入令牌值的東西都是無用的儀式,這種方式會增加複雜性。那麼這些注入令牌有什麼用處呢? –

+1

@HamedBaatour DI模式有益的原因相同。可擴展性和可測試性。 – estus

+1

@HamedBaatour,請參閱[這](http://misko.hevery.com/2008/11/11/clean-code-talks-dependency-injection/) –