And*_*ata 12 javascript frp rxjs
我目前正在尝试观察给定对象的任何更改,包括它的所有元素.
以下代码仅在对象[x]更新时触发,但如果单独更新对象[x]的元素(如object [x] [y])则不会触发
<script>
var elem = document.getElementById("test1");
var log = function(x) {
elem.innerHTML += x + "<br/><br/><br/>";
};
var a = [{a:1,b:2},
{a:2,b:5}
];
var source = Rx.Observable
.ofObjectChanges(a)
.map(function(x) {
return JSON.stringify(x);
});
var subscription = source.subscribe(
function (x) {log(x);},
function (err) {log(err);},
function () {log('Completed');}
);
a[0] = a[1];
</script>
Run Code Online (Sandbox Code Playgroud)
此代码运行并正确触发.
然而.如果我改为这个
a[0]['a'] = 3;
Run Code Online (Sandbox Code Playgroud)
然后什么都没发生
编辑
一个更好的方法来表达这一点,我如何观察一组对象的变化?
如果只想更改嵌套对象:
var source = rx.Observable.from(a).flatMap(function(item) {
return rx.Observable.ofObjectChanges(item);
});
Run Code Online (Sandbox Code Playgroud)
如果你还想要改变a[0] = a[1]:
var source = rx.Observable.merge(
rx.Observable.ofArrayChanges(a),
rx.Observable.from(a).flatMap(function(item) {
return rx.Observable.ofObjectChanges(item);
})
);
Run Code Online (Sandbox Code Playgroud)
该flatMap或selectMany(它们是相同的功能)将允许你遍历一个值,执行返回可观察到的一个功能.来自所有这些Observable的值被"展平"到返回的新流上.
http://reactivex.io/documentation/operators/flatmap.html