2012-04-03 43 views
2

我已經與knockout.js一起創建了一個gui,它允許用戶通過很多不同的主題來篩選他的數據。大多數這些主題由組合框項目表示,它們是html中的選擇項。如何在初始化時間禁用更新?

我用敲除訂閱的變化在所有的過濾器選擇的。訂閱事件只是調用收集過濾器設置的函數,通過ajax將其發送到服務器,並獲取滿足過濾器返回的項目列表。

此外,來自服務器的數據還包含每個選擇的可用過濾器主題。

我一直想知道的啓動速度,因爲它確實花了一段時間的GUI是完全可用。不久之前,我在數據傳遞函數中設置了一個斷點,並且在啓動時被稱爲大約20次時感到非常驚訝。 :-(

我怎樣才能防止這種


var viewModel = { 
    entries: ko.observableArray(),   // this is receiving the filtered items 

    selectedMode: ko.observable(null),   // Filter 1 initialized to null 
    selectedSubMode: ko.observable(null),  // Filter 2 initialized to null 
    . 
    . 
    availableModes: ko.observableArray(),  // Available filter items 1. 
    availableSubModes: ko.observableArray(), // Available filter items 2. 
}; 
 

html元素,勢必是這樣的:

 

<select 
    id="selectMode" 
    tabindex="1" 
    data-bind="options: availableModes, 
       value: selectedMode, 
       optionsCaption: 'Any'" 
> 
</select> 
 

在頁面的加載時間我發出selectedItems與單個負載被「空」,所以返回所有可用數據的第一頁,我設置了availableModes和availableSubModes的可用項目數據返回的所有選擇。

然後,TY迭代開始的PE:

第一選擇框改變其顯示到「任何」值我在作爲optionsCaption結合設置。這似乎觸發了變化事件。這將再次啓動對服務器的請求,並將下一個選擇項設置爲「Any」。這對於所有選擇元素都是重複的。

有沒有人有一個想法,我可以如何防止這種情況發生?

我的第一個想法是將數據加載過程中禁用在淘汰賽更新,更新完成後,強制更新。但是我找不到合適的方法。

感謝您的任何提示...

+0

你如何訂閱下拉式更改? – 2012-04-03 21:11:55

+0

我對每個選擇項使用以下內容: viewModel.selectedMode.subscribe(function(){ viewModel.loadData(); }); loadData是將請求發送到服務器並使用返回的數據的函數。 – nttakr 2012-04-04 22:30:19

+0

只是一個想法......如果不是訂閱觀察者,而是訂閱下拉菜單的變化事件? – 2012-04-05 13:05:37

回答

2

沒有與認購方法等看到您完整的代碼很難說究竟什麼是錯的。不過,我注意到一部分你提到select被設置爲「Any」觸發了一個改變事件。我想我可以根據你的描述來解釋這一點。

從KO選項綁定文檔。

KO將在項目列表前添加一個顯示文本 「Select a item ...」的項目,其值爲undefined。因此,如果myChosenValue 包含未定義的值(默認情況下爲可觀察值),則將選擇 虛擬選項。

這意味着將selectedMode值設置爲null與「Any」的值不匹配。綁定嘗試匹配您的現有值,但它不能將selectMode設置爲undefined,並觸發更改。

以此jsfiddle。您可以看到服務器抓取日誌語句被觸發。如果刪除selectedMode null賦值,則日誌語句不會觸發。

http://jsfiddle.net/madcapnmckay/H7jzd/

如果這並不能完全解決的事情,那叉子撥弄,包括完整的訂閱設置和一些假阿賈克斯聲明,我們應該能夠得到它的工作。

希望這可以幫助

相關問題