2017-08-10 5 views
1

現在、私はRxJで目を覚ましており、観測対象を返すモジュールを定義しようとしています。 (各モジュールはブラックボックスとして動作し、オブザーバビリティのみを公開します)。 私の主な問題は、私が使用しているサードパーティのライブラリによるものです:UWA: 私のすべてのDOM要素はUWAオブジェクトから生成され、UWAの "イベント"を引き起こします。 私はこれらのカスタムイベントをオブザーバブルにマッピングしたいと思います。ここ は、イベントデータ構造の一部である:ここでRxJを使用して複数のコールバックを観測可能にマップする

tabBar = *somecode*...{ 
.... 
    onEndEditTab: function (callback) { 
    return this.modelEvent.subscribe({ 
     event: endEditTabEvent 
    }, callback); 
    },.... 
} 

は私の現在のコードです:

const tabBar = new tabBar(); 
tabBar.inject(domContainer); 
const observer={ 
    next: (t) =>{ 
    const oldValue=t.target.textContent; 
    const cbObservable = Rx.Observable.bindCallback(tabBar.onEndEditTab); 
    //a new cbObservable is created at each dblclick event 
    // (due to bindCallBack property which is to retern only one time. 
    cbObservable .call(tabBar).subscribe(
     (v) => { 
     console.log({oldLabel:oldValue,newLabel:v[0].button.label}); 
     } 
    );   
Rx.Observable.fromEvent(tabBar, 'dblclick').subscribe(observer); 

このコードは、タブのラベルが編集されるたびに動作し、古いものと新しい値を記録します。 しかし、私が望むのは、これを印刷するのではなく、すべての結果を新しいObservableストリームに集約することです。

dblclick : ----(1)----(2)---....(n)-> 

(nはDBLCLICKの未知数がある場合...) にマップされます:

cbObservable : ----(1:{old,new})--| 
       ----(2:{old,new})--| 
       .... 
       ----(n:{old,new})--| 

そして、何私は現在したいことは次のとおりです。

outputStream : ----(1:{old,new})---(2:{old,new})--...(n:{old,new})---> 
大理石の図を用いて

ここで、outputStreamはホット観測可能です。 には、上記のすべての制約があります。 ありがとうございます!それが働いていた1簡単な修正した後、あなたの答えをありがとう:

答えて

0

がswitchMap

Rx.Observable.fromEvent(tabBar, 'dblclick').switchMap(() => { 
    const oldValue=t.target.textContent; 
    return Rx.Observable.bindCallback(tabBar.onEndEditTab).map((v) => { 
     return {old: oldValue, new: v[0]} 
    }); 
}) 

またはこのようなものを使用しようとすると、その後、観測可能

+0

定義に従って:その入力と出力が *観測されないので、 'bindCallback'は、オペレータではありません。入力はいくつかのパラメータを持つ 'func'関数ですが、 *が実行されたときに' func'が呼び出すコールバック関数でなければなりません。 質問が多いので、この出力を観測可能なものに変換する方法は? – occimort

0

@llCorvinuSll結果に単一subscribtionを行います。

bindCallbackに呼び出し(yourObject)を追加する!それが呼び出される必要があるので は、関数を返しbindCallback:

Rx.Observable.fromEvent(tabBar, 'dblclick').switchMap(() => { 
    const oldValue=t.target.textContent; 
    return Rx.Observable.bindCallback(tabBar.onEndEditTab).call(tabBar).map((v) => { 
     return {old: oldValue, new: v[0]} 
    }); 
}) 
関連する問題