【发布时间】:2018-09-15 10:41:31
【问题描述】:
我有一个对象,我想使用 rxjs 观察其变化。该对象有多个属性,当它们中的任何一个发生变化时,我想知道哪个被更改了,它的新值是什么。我将以下简化版本的代码放在一起,但它不能按预期工作:http://jsbin.com/sidukulowi/1/edit?js,console
const store = Rx.Observable.create(function(observer) {
let state = { userActions: {
window: {
leftPanelWidth: 300,
backgroundColor: 0xffffff,
}
}};
observer.next(state);
state = { userActions: {
window: {
leftPanelWidth: 250,
backgroundColor: 0xffffff,
}
}};
observer.next(state);
state = { userActions: {
window: {
leftPanelWidth: 250,
backgroundColor: 0xff00ff,
}
}};
observer.next(state);
});
const subscribe = store
.map( state => state.userActions.window )
.distinctUntilChanged( ( a, b ) => {
return a.leftPanelWidth === b.leftPanelWidth && a.backgroundColor === b.backgroundColor
})
.subscribe(val => console.dir(val));
当上面的代码运行时,当窗口对象中的某些内容发生更改时,我会正确地得到更新,但是我不知道如何确定哪个属性是更改的。
我将如何修改它,以便我可以看到在第一次更改中,leftPanelWidth 从 300 更改为 250,而在下一次更改中,backgroundColor 从更改为0xffffff 到 0xff00ff ?
【问题讨论】:
-
您可以使用 es6 代理设置陷阱,以便在对象发生更改时通知
-
我不知道“使用 es6 代理设置陷阱”是什么意思。你能给我一个帮助文档或者一些示例代码来说明如何做到这一点吗?
-
基本上代理可以帮助您设置不同类型的陷阱。陷阱本质上只是功能,当您尝试对代理对象执行某些操作(访问属性、设置属性、删除属性等)时,它们将充当中间件。下面的文章很好地解释了代理ponyfoo.com/articles/es6-proxies-in-depth
-
我通读了那篇文章和这篇文章:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…,但我不明白如何在我的情况下使用代理。你能给我看一些示例代码吗?
标签: javascript object properties rxjs observers