rx指南说尽可能避免副作用,如果不可避免的话,将它们放在do()(js中的doAction)子句中.
但是,UI中非常常见的副作用是创建一些在下游(由子窗口小部件)引用的资源(例如< div>).您必须捕获这些资源的句柄,以便可以传递它们.例如.如果你有一个数组,每个都需要一个div,你可以为每个创建一个div,并将这些div的句柄传递给子节点.
但是doAction()会丢弃副作用的返回值,因此您无法捕获创建的对象的句柄.你必须在select()中做副作用.
我看这一切都错了吗?创建的资源是状态,并且是副作用.你想要流中的状态,但是你不能把它放在流中而不将副作用放在select()中,这是禁忌的.
解决方法:
请记住,它们只是指导方针.如果你想要一个副作用选择功能,你知道它将如何使用,那么去吧.
但是……你是否考虑过创建分离元素并仅将它们附加到订阅回调中的文档中?换句话说,不是资源的创造是副作用.只有当您对资源执行某些操作时.我已经使用过这种模式了几次……
$(someElement).onAsObservable("click")
.select(function(ev) {
return $("<div>");
})
...do stuff to detached div
.subscribe(function($el) {
// finally attach it
$(container).append($el);
});