我有以下代码,其目的是听取'ui state'类的变化(有一堆可观察的字段)。
get ui_store$(): Subject<UIStore> {
if (!this.uiStoreSubject) {
this.uiStoreSubject = new Subject<UIStore>();
let stream = toStream(() => {
this.logger.info(`UI Store changed to ${this._ui_store}. Signed in: ${this._ui_store.signed_in}`);
toJS(this._ui_store);
return this._ui_store;
});
stream.subscribe(this.uiStoreSubject);
}
return this.uiStoreSubject;
}
我无法接收通知。作为测试,在我的页面上,我把:
this.sub = this.store.ui_store$.subscribe(uis => {
this.logger.error(`**** UI Changed to ${SafeJSON.stringify(uis)}`)
}, err => {
this.logger.error(`Error in UI State change: ${err}`)
}, () => {
this.logger.warn(`UI State change COMPLETED`);
});
页面上有另一个按钮,用于在UI商店中设置属性,我确实看到来自toStream()的日志记录,因此我知道更改会导致toStream()发出更改。
22:24:04,486 service.store UI Store已更改为[object Object]。登录:true
但订阅该主题的页面从未看到任何内容。 如果我破解并放置:
this.uiStoreSubject.next(this._ui_store);
在toStream()方法中,为了强制主体接收一个值,它可以工作......但是我认为这不应该是必要的,除了感觉不对。我去疯了吗?
据我所读,我想:
stream.subscribe(this.uiStoreSubject);
应该a)监听流上的变化,并b)将它们吐回主题。据我所知,它只是在这个主题上称为“下一个”。
这是mobx的toStream():
function toStream(expression) {
var computedValue = mobx_1.computed(expression);
return _a = {
subscribe: function (observer) {
return {
unsubscribe: computedValue.observe(typeof observer === "function"
? function (_a) {
var newValue = _a.newValue;
return observer(newValue);
}
: function (_a) {
var newValue = _a.newValue;
return observer.next(newValue);
})
};
}
},
_a[observableSymbol()] = self,
_a;
var _a;
我必须承认我并不完全清楚为什么它会返回一个有一个'取消订阅'对象成员的函数 - 我不明白......也许是内部代码,调用.next永远不会被执行?< / p>
请问我出错的任何提示或指示?