Javascript 角度上的可观察/主体丢失订户
我在类中使用静态变量来存储初始化的Javascript 角度上的可观察/主体丢失订户,javascript,angular,rxjs,observable,behaviorsubject,Javascript,Angular,Rxjs,Observable,Behaviorsubject,我在类中使用静态变量来存储初始化的行为主题,以便在从服务器加载用户设置时提供默认值 (下面是一个简化的示例版本) loadFromServer()正按照预期工作,并且在第一个事件之后调用了AppSettings.currency.next(settings.currency)行。然而,有趣的是,在这一点上,AppSettings.currency.observables[]在先前填充时是空的 我的想法是,我们最初是不同实例的问题,但我使用了一个静态变量(甚至尝试了一个全局变量)来避免不同的实例
行为主题
,以便在从服务器加载用户设置时提供默认值
(下面是一个简化的示例版本)
loadFromServer()
正按照预期工作,并且在第一个事件之后调用了AppSettings.currency.next(settings.currency)
行。然而,有趣的是,在这一点上,AppSettings.currency.observables[]
在先前填充时是空的
我的想法是,我们最初是不同实例的问题,但我使用了一个静态变量(甚至尝试了一个全局变量)来避免不同的实例
这是当前的工作流
myComponent.constructor
订阅AppSettings.currency.next(settings.currency)
我错过了什么吗?嗯,我觉得不好意思 我发现问题是由于我的
import
语句在文件引用上具有(错误的)文件后缀
从导入{AppSettings}./settings
.js;
当我在其他地方使用(正确的)
从“/settings”导入{AppSettings};
这导致WebPack编译了该类的两个版本,TypeScript和(编译的)Javascript版本,从而创建了两个不同的实例。我设法在某个地方看到了一个
AppSettings\u 1
,这让我陷入了兔子洞,最终放弃了它。我觉得很不好意思
我发现问题是由于我的import
语句在文件引用上具有(错误的)文件后缀
从导入{AppSettings}./settings
.js;
当我在其他地方使用(正确的)
从“/settings”导入{AppSettings};
这导致WebPack编译该类的两个版本,TypeScript和(已编译)Javascript版本,从而创建了两个不同的实例。我设法在某个地方看到了一个
AppSettings\u 1
,这让我陷入了兔子洞,最终放弃了它。是否有拼写错误?我看到了setting.loadFromServer。不应该是settings吗?这是一个拼写错误,但这个示例是我代码的总结版本,因为我刚刚写了一个正在运行的简略版本。是否有输入错误?我看到setting.loadFromServer。不应该是settings吗?这是一个输入错误,但示例是我代码的摘要版本,因为我刚刚在运行中编写了一个简略版本。
@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);
});
}
}
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();
}
}