嗯,问题本身很难简单描述,所以这里有live example来证明。好像我误解了Rx.js的工作原理,否则这里的功能来自一个bug。
我尝试做的是一个简单的反应式渲染设置,您在屏幕上看到的内容以及发生的事件都是以Observables的形式描述的。问题在于,由于某些不可思议的原因,当代码以单向编写时,事件会完全丢弃,但在理论上应该等效的代码中可以正常工作。
所以,让我们从上面示例代码中的第一个案例开始:
var dom = makeBox('one');
var clicks = Rx.Observable.fromEvent(dom, 'click');
如果你创建了一个DOM片段,那么你可以简单地使用fromEvent来获取它发出的任何事件的Observable。到现在为止还挺好。您可以单击此框并查看写入日志的一堆行。
现在,下一步是让DOM反应,表达它随时间的变化。
var domStream = Rx.Observable.return(makeBox('two'));
var clicks = domStream.flatMapLatest(function(dom) {
return Rx.Observable.fromEvent(dom, 'click');
});
这会使它成为一个Observable,使用return来生成最简单,常量的情况。您感兴趣的事件将是最新版dom发出的事件,而这正是flatMapLatest运算符所做的事情。这种变体仍然有效。
最终,目标是根据某些应用程序状态生成当前的DOM状态。也就是说,将它从一个Observable映射到另一个Observable。让我们现在使用最简单的版本,将一个常量值作为状态,然后将其映射到我们之前使用的相同固定输出:
var updates = Rx.Observable.return(1);
var domStream = updates.map(function (update) {
return makeBox('three');
});
var clicks = domStream.flatMapLatest(function(dom) {
return Rx.Observable.fromEvent(dom, 'click');
});
这与以前的版本不应该有任何不同。但是,无论你做什么,都不会输出任何事件。
这到底发生了什么?我是否误解了Rx的一些基本概念,或者是什么?我遇到了热与冷Observables的一些问题,但在这个极小的情况下,这似乎是无关的。所以,我有点想法。谁能开导我?