簡體   English   中英

Angular中可觀察/主題丟失的訂戶

[英]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[]為空,之前已填寫。

我以為我們最初是一個不同實例的問題,但是我使用一個靜態變量(甚至嘗試過使用全局變量)來避免不同實例。

這是當前的工作流程...

  1. myComponent.constructor訂閱
  2. 該訂閱將觸發,並提供默認的“ USD”
  3. 加載服務器數據,並調用AppSettings.currency.next(settings.currency)
  4. 然后……什么都沒有

我期望在第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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM