ES6观察物体的方式是用Proxies。您创建一个包装原始对象的代理服务器,并在其上进行工作。你可以用它来创建类似于Observable.ofObjectChanges
的东西。这里的部分实现(仅set
你需要执行其他traps):
Observable.ofProxyChanges = (target) => {
let subject = new Subject
let proxy = new Proxy(target, {
set(target, key, val) {
let oldValue = target[key]
target[key] = val
subject.next({
type: oldValue === undefined ? "add" : "change",
object: target,
name: key,
oldValue: oldValue
})
}
})
return [proxy, subject.asObservable()]
}
let [obj, objChange$] = Observable.ofProxyChanges({})
objChange$.subscribe(console.log)
obj.bar = 1 // logs { type: "add", name: "bar", object: { bar: 1 } }
obj.foo = 2 // logs { type: "add", name: "foo", object: { bar: 1, foo: 2 } }
obj.foo = 3 // logs { type: "change", name: "foo", object: { bar: 1, foo: 3 }, oldValue: 2 }
我很感兴趣,接受这个问题的答案 – Marin
有没有尝试过,但我相信@Skeptor答案在我的情况下会很有用。 –