2014-06-28 67 views
1

我有對某些事件再次在函數內部可觀察到的訂閱:淘汰賽觀察到的認購觸發多次

ko.computed(function() { 
    alert('computed fired'); 

    self.obs2.subscribe(function() { 
     alert('subscribe fired'); 
    }); 

    return self.obs1(); 
}); 

我注意到,該功能運行時,不執行認購裏面的代碼,但是當訂閱最終會激發,它內部的代碼會像重複函數在觸發前一樣運行多次。

它太複雜的的jsfiddle重現,所以我選定了一個簡單的,但使用類似的例子訂閱內computed觀察到:

http://jsfiddle.net/norbiu/7hGNb/

  1. 點擊「編輯OBS2」幾次數會導致警報每次觸發
  2. 點擊'編輯Obs1'幾次將導致第一個警報觸發,而不是訂閱內部的一個
  3. 點擊'Edit Obs2'一次會導致訂閱中的警報多次運行。

有沒有辦法讓訂閱只運行一次而不必在重複之外移動它?

+0

您的示例過於簡化。爲什麼你需要在計算機內部訂閱?你想達到什麼目的?因爲唯一的解決方案是將訂閱移動到您不想執行的計算之外...... – nemesv

回答

1

您將在您的obs2上訂閱您的computed評估次數。

我不知道你想在一個計算中的不同屬性上訂閱你想實現什麼。我敢肯定,有一個更妥善的解決辦法存在你的使用情況......

但是一個可能的解決方法是調用subscribe當存儲返回subscription對象,如果有一個已經存儲subscription存在提前處理它您obs2再次訂閱:

self.subscription = null; 

ko.computed(function() { 
    alert('computed fired'); 

    if (self.subscription) 
     self.subscription.dispose(); 

    self.subscription = self.obs2.subscribe(function() { 
     alert('subscribe fired'); 
    }); 

    return self.obs1(); 
}); 

演示JSFiddle