Я использую статическую переменную в своем классе для хранения инициализированного 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
подписывается - , что подписка срабатывает,давая значение по умолчанию 'USD'
- , данные сервера загружаются, и
AppSettings.currency.next(settings.currency)
называется - ... then ... Ничего ....
Я ожидаю, что в части 4 Наблюдатель, подписавшийся в части 1, будет снова уволен, но это не так, что сделает моего прославленного Наблюдателя постоянной.: (
Я что-то упустил?