Наблюдаемый / Субъект теряет подписчиков в Angular - PullRequest
0 голосов
/ 06 февраля 2019

Я использую статическую переменную в своем классе для хранения инициализированного 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. ... then ... Ничего ....

Я ожидаю, что в части 4 Наблюдатель, подписавшийся в части 1, будет снова уволен, но это не так, что сделает моего прославленного Наблюдателя постоянной.: (

Я что-то упустил?

1 Ответ

0 голосов
/ 06 февраля 2019

Ну, я чувствую себя застенчиво ....

Выяснил, что проблема была в том, что у моего оператора import был (неправильный) суффикс файла в ссылке на файл.Итак, в файле myComponent у меня было ...

import { AppSettings } from './settings .js ';

В то время как везде я использовал (правильный)

import { AppSettings } from './settings';

, в результате которого WebPack скомпилировал две версии класса, TypeScript и (скомпилированную) версию Javascript, создав таким образом два разных экземпляра.Мне удалось где-то увидеть AppSettings_1, что привело меня вниз по кроличьей норе, чтобы, наконец, отдать его.

...