2014-02-27 61 views
17

如何构造rxjs应用程序?大约有一百个玩具介绍示例,但不是一个完整应用程序的例子,它包含小部件,子小部件等,显示整个应用程序的数据流。如何构建rxjs代码

E.g.假设你有一个可观察的状态。你需要将它传递给一个小部件。该小部件具有需要部分状态的子小部件。你是否订阅?

sub = state.subscribe(widget) 

现在'小部件'在单子之外。子小部件不能在状态上使用可观察的方法。如果您将小部件作为副作用运行,则会遇到同样的问题。

state.doAction(widget) 

那么你把流传递给小部件?如果是这样,你回来了什么?

what = widget(state) 

窗口小部件是否订阅状态并返回一次性消息?它返回从状态派生的流吗?如果是这样,它里面有什么?你是否试图通过广泛使用selectMany(identity)来从所有widgets/subwidgets/sub-sub-widgets中收集所有流,以获得您订阅的最终应用程序流,以便将所有内容都踢掉?

如果小部件根据需要根据状态创建子小部件,小部件如何管理其子小部件?我一直试图用groupBy()来解决问题,每个subwidget都有一个组,但是从嵌套的observable管理所有订阅或流是一个令人难以置信的噩梦。

即使是整个应用程序的一个例子也会有所帮助。

回答

6

将观察对象作为参数传递给构件的构造函数,并让构件在将其传递给子构件构造函数之前使用额外的单元进行订阅或转换。该小部件将管理自己的订阅。

如果一个小部件产生数据(例如,用户输入),则将其公开为小部件上的Observable属性。

注意小部件本身不是可观察流的一部分。他们只是消耗输入流并产生输出流。

// main app 
var someState = Rx.Observable....; 
var someWidget = createSomeWidget(someState, ...); 
var s = someWidget.userData.map(...).subscribe(...); 

// SomeWidget 
var SomeWidget = function ($element, state, ...) { 
    this.userData = $element 
     .find("button.save") 
     .onAsObservable("click") 
     .map(...collect form fields...); 

    // we need to do stuff with state 
    this.s = state.subscribe(...); 

    // we also need to make a child widget that needs some of the state 
    // after we have sanitized it a bit. 
    var childState = state.filter(...).map(...)...; 
    this.childWidget = new ChildWidget(childState, ...); 

    // listen to child widgets? 
} 

等等。如果您使用的是Knockout,您可以利用ko.observable创建双向可观察流,有时可以避免需要在您的小部件上添加输出属性,但这是一个完整的另一主题:)

+0

您可以评论如何处理依赖流的小部件生命周期?即您必须检查状态以了解何时创建和销毁子窗口小部件。您可以将子创建移动到subscribe()中,但是事情开始变得有点混乱,例如你在订阅状态内进行状态订阅,这会造成奇怪的订购问题。如果子窗口小部件也生成父窗口需要的流(例如,ajax请求),则会变得更加混乱。 – user1009908

+1

你需要发布你正在尝试解决的更具体的示例用例。您目前的描述对我来说有点太抽象,无法理解您是如何陷入这种困境的。你使用任何库/框架? MVC? MVVM?等等。我几年来一直在构建高度被动的RxJs MVVM UI,而我从未遇到过这个问题。所以,如果你可以发布一个新的Q与一个具体的例子,我会添加建议,如果我可以 – Brandon

+0

新问题在这里: http://stackoverflow.com/questions/22185030/rx-data-driven-subwidgets – user1009908