2016-09-30 34 views
1

我有一個應用程序有幾個淘汰賽的組件。淘汰賽組件都綁定到一組可訂閱的訂閱,點擊按鈕進行更新。每個組件都有多個訂閱功能,監聽訂閱者的更改以調用其中包含的更新功能。更新多個subscribables,但只執行更新一次在淘汰賽?

如何配置它們只在更新多個訂閱者時調用其更新功能一次?

下面是如何我的大多數組件負載的示例代碼段:

this.OBSERVABLE_NAME.subscribe(function() { this.updateChart(); }, this); 
this.OBSERVABLE_NAME.subscribe(function() { this.updateChart(); }, this); 
this.OBSERVABLE_NAME.subscribe(function() { this.updateChart(); }, this); 
this.OBSERVABLE_NAME.subscribe(function() { this.updateChart(); }, this); 

this.updateChart = function() { 
    $.ajax({ 
     type: "POST", 
     traditional: true, 
     url: this.ajax_location, 
     data: this.ajax_parameters, 
     success: function (data) { 
      // DO SOMETHING 
     }.bind(this), 
     error: function (returndata) { 
      alert("Error:\n" + returndata.responseText); 
     } 
    }); 
}; 

但是,如果我更換訂閱功能:

ko.computed(function() { 
     $.ajax({ 
     type: "POST", 
     traditional: true, 
     url: this.ajax_location, 
     data: this.ajax_parameters, 
     success: function (data) { 
      // DO SOMETHING 
     }.bind(this), 
     error: function (returndata) { 
      alert("Error:\n" + returndata.responseText); 
     } 
    }); 
}, this).extend({ throttle: 1 }); 

這似乎爲要求的工作。我知道油門貶值,但我很好奇爲什麼延期似乎沒有正常工作。

+0

你有一些示例代碼?這聽起來像是延期更新的可能用例,但是如果沒有代碼片段或示例,很難說。 –

+0

我用代碼示例更新了這個問題。 –

回答

0

看起來這是節流或推遲更新了良好的擴展使用可觀察到的。在我的情況下,推遲似乎沒有正常工作,但限制它。我使用以下片段:

ko.computed(function() { 
     $.ajax({ 
     type: "POST", 
     traditional: true, 
     url: this.ajax_location, 
     data: this.ajax_parameters, 
     success: function (data) { 
      // DO SOMETHING 
     }.bind(this), 
     error: function (returndata) { 
      alert("Error:\n" + returndata.responseText); 
     } 
    }); 
}, this).extend({ throttle: 1 }); 
1

沒有一個具體的例子很難說,但我認爲你正在尋找deferred updates

可以使用.extend({ deferred: true })

+0

足夠奇怪的推遲更新似乎並沒有解決它,但節流。 –