2017-09-14 70 views
0

你好嗎。我是Rxjs的新手。我不確定如何合併來自不同事件的觀察值。我綜合Rxjs與Vue.js如何使Rxjs中的多個事件可觀察?

export default { 
    name: 'useraside', 
    data: function() { 
    return { 
     searchKey: '', 
     isPublic: true 
    } 
    }, 
    components: { 
    User 
    }, 
    subscriptions() { 
    return { 
     // this is the example in RxJS's readme. 
     raps: this.$watchAsObservable('searchKey') 
     .pluck('newValue') 
     // .filter(text => text.length > 1) 
     .debounceTime(500) 
     .distinctUntilChanged() 
     .switchMap(terms => fetchRaps(terms, this.userdata._id, this.isPublic)) 
     .map(formatResult) 
    } 
    } 
} 

現在事件來自searchKey變化,現在我想訂閱同樣觀察到當isPublic值的變化。 所以我想每當searchKey更改或isPublic更改時都會得到說唱。 謝謝。

+2

只是使用合併操作;)http://reactivex.io/rxjs/class/es6 /Observable.js~Observable.html#static-method-merge – Maxime

+0

謝謝。現在正在工作 –

回答

1

您可以使用merge運算符,並在您的switchMap中繼續使用this.isPublic,正如Maxime在評論中所建議的那樣。

但我寧願去一個很好的純數據流,你聽兩個值,並在你的處理程序中使用它們。像

Rx.Observable.combineLatest(
    this.$watchAsObservable('searchKey').pluck('newValue'), 
    this.$watchAsObservable('isPublic').pluch('newValue'), 
    ([searchKey, isPublic]) => ({ searchKey, isPublic }) 
) 
.dedounceTime(500) 
.distinctUntilChanged() 
.switchMap(({ searchTerm, isPublic }) => fetchRaps(searchTerm, this.userdata._id, isPublic)) 

或事件更好的事情是,你可以將初始數據結構更改爲類似:

data: function() { 
    return { 
     searchConfig: { 
     searchKey: '', 
     isPublic: true 
     } 
    } 
    }, 

,那麼你可以刪除combineLatest,僅看searchConfig財產。

此實現的好處是您的數據流是純粹的,並且不依賴於任何外部上下文(不需要this.isPublic)。每個依賴項都在數據流開始時顯式聲明。

如果你想走得更遠,你還可以觀看userdata和明確地傳遞下來的數據流:)