[英]Observable / Subject loosing subscribers in Angular
我在類中使用靜態變量存儲初始化的BehaviourSubject
,以便在從服務器加載用戶設置時可以提供默認值。
(在下面放了一個簡化的示例版本)
@Injectable
export class AppSettings {
// Using a static to globalize our variable to get
// around different instances making lots of requests.
static readonly currency: Subject<string> = new BehaviorSubject('USD');
// Return a property for general consumption, but using
// a global/static variable to ensure we only call once.
get currency(): Observable<string> { return AppSettings.currency; }
loadFromServer():any {
// Broadcast the currency once we get back
// our settings data from the server.
this.someService.getSettings().subscribe(settings => {
// this is called lastly, but AppSettings.currency.observers
// seems to show as an empty array in the Inspector??
AppSettings.currency.next(settings.currency);
});
}
}
當我稍后在代碼中訂閱它時,它將運行一次(因為它是BehaviorSubject
),但是此后將不會觸發。
export class myComponent {
public currency: string;
constructor(settings: AppSettings) {
// Called once with the default 'USD'
settings.currency.subscribe(currency => {
// only gets here once, before loadFromServer
console.log(currency);
this.currency = currency;
});
// Load from the server and have our subscription
// update our Currency property.
settings.loadFromServer();
}
}
loadFromServer()
完全按預期工作,並且在第一個事件之后調用AppSettings.currency.next(settings.currency)
行。 但是,有趣的是,此時, AppSettings.currency.observables[]
為空,之前已填寫。
我以為我們最初是一個不同實例的問題,但是我使用一個靜態變量(甚至嘗試過使用全局變量)來避免不同實例。
這是當前的工作流程...
myComponent.constructor
訂閱 AppSettings.currency.next(settings.currency)
我期望在第4部分中將再次觸發在第1部分中訂閱的觀察者,但事實並非如此,這使我贊美的Observer保持不變。 :(
我想念什么嗎?
好吧,我感到很sheep。
找出問題是由於我的import
語句在文件引用上具有(錯誤)文件后綴。 因此,在myComponent
文件中,我有...
import { AppSettings } from './settings
.js ';
import { AppSettings } from './settings
';
雖然我一直在使用其他地方(正確的地方)
import { AppSettings } from './settings';
這導致WebPack編譯該類的兩個版本,即TypeScript 和 (已編譯的)Javascript版本,從而創建了兩個不同的實例。 我設法在某個地方看到一個AppSettings_1
,這使我AppSettings_1
兔子洞,終於把它丟了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.