2014-02-27 96 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