2016-11-17 71 views
2

問題重用代碼 - 用戶身體

我使用的是一對夫婦在Angular2 BehaviourSubject瓦爾從服務中獲得的數據,並更新控制器陣列中重複的代碼。

問題是所有各自的.subscribe()功能執行相同的操作,我無法找到重用代碼的方法 - 可能傳遞一個lambda函數到.subscribe()的主體?

一次又一次重新輸入相同的代碼沒有任何意義 - 它會影響組件的可讀性。

方案

來自不同來源的

this.catagoryASubject.subscribe(
     value => { 
      // updating array and chart 
      this.radarChartData.forEach((val, i) => { if (val.label == value.name) { this.radarChartData[i].data = value.data } }); 
     }, 
     err => console.log("error"), 
     () => console.log("complete") 
    ); 

this.catagoryBSubject.subscribe(
     // same code as in the above subscriber 
    ); 

回答

7

更新用數據的圖表可以使用let()操作者可觀察到的鏈的基團共同功能。這需要觀察的輸入,並返回一個可觀察到的,所以你可以寫:

function updateChart(observable: Observable<any>) { 
    return observable 
    .map(value => {/* do your thing*/}) 
// .filter().switchMap().do() // whatever 
    .catch(error => console.log("error")) 
} 

,然後使用它:

this.catagoryASubject.let(updateChart).subscribe(); 
this.catagoryBSubject.let(updateChart).subscribe(); 
this.catagoryCSubject.let(updateChart).subscribe(); 

我更喜歡使用subscribe()只是作爲觸發,並沒有做任何處理工作那裏。這是很多清潔,當你需要,你可以方便地切換到async管......

this.A = this.catagoryASubject.let(updateChart); 

<div> {{ A |async |json }} </div> 
+1

我來這裏是爲了給一個答案,我只是想到了一個更好的。謝謝@Sasxa! – Maxime

+0

函數內部我不能使用'this'運算符來引用組件中的其他變量。有什麼建議麼? –

+1

使用'this.catagoryASubject.let(o => updateChart(o))'語法 – Sasxa