2017-01-14 52 views
1

劍道UI版本2015.2.805劍道UI下拉列表虛擬化第2頁上失敗取回的

我有一個劍道DROPDOWNLIST每個實例配置在劍道文檔的數據做分頁。它適用於頁面1,使用take/skip參數從服務器加載80個條目。當我將列表向下翻到新項目應該加載的位置時,我可以在提琴手中看到小部件正在請求take = 80,skip = 80(這是第2頁),服務器正在返回請求的記錄。但小部件只是不停地重複請求相同的頁面,直到我停止。在此期間,卸載的條目在列表中顯示爲帶有動畫旋轉器的「加載」。

要做虛擬化,widget需要一個valueMapper(我使用舊的kendo UI,因此它是必需的)。我已經實現了它,雖然我不清楚它應該返回什麼(我相信項目索引),但我從文檔中知道,如果它請求不存在的值返回[],那就是我在這種情況下所做的。我修改了convertValues函數,只發送一個索引而不是數組,但valueMapper只在初始化時調用一次,所以我返回的任何錯誤都不會對這個問題產生任何影響(我相信)。當widget首次在fiddler中初始化時,我看到valueMapper被調用的值爲-1,並且服務器返回[],那麼widget會調用分頁數據(take = 80,skip = 0)和服務器返回並且小部件正常顯示數據。

當我向下翻頁到卸載的項目時,窗口小部件會調用第2頁數據(take = 80,skip = 80),服務器返回它,但小部件不斷重新請求數據。小部件在第一次調用之後從不調用valueMapper(這可能是正常的)。

我已經爲高度和itemHeight設置了正確的頁面大小,但是這隻會導致第一頁被加載兩次(它不是)。

下面是設置:

wizard.paramMap = function (data, type) { 
var params = {}; 
params.take = data.take; 
params.skip = data.skip; 
return params; 
}; 


$("#clientField").kendoDropDownList({ 
autoWidth: true, 
dataTextField: "text", 
dataValueField: "value", 
virtual: { 
    itemHeight: 26, 
    valueMapper: function(options) { 
     $.ajax({ 
      url: resturi + "clientlist/valueMapper", 
      dataType: "json", 
      type: "GET", 
      data: convertValues(options.value), 
      success: function (data) { 
       console.log("valueMapper = " + data) 
       options.success(JSON.parse(data)); 
      } 
     }) 
    } 
}, 
height: 520, 
dataSource: { 
    transport: { 
     read: { 
      url: resturi + "clientlist", 
      dataType: "json", 
      type: "get" 
     }, 
     parameterMap: wizard.paramMap 
    }, 
    schema: { 
     data: function (response) { 
      console.log("clientlist = " + response); 
      var o = JSON.parse(response); 
      return o; 
     } 
    }, 
    pageSize: 80, 
    serverPaging: true 
} 
}); 

function convertValues(value) { 

var data = {}; 
value = $.isArray(value) ? value : [value]; 

for (var idx = 0; idx < value.length; idx++) { 
    //data["values[" + idx + "]"] = value[idx]; 
    data["values"] = value[idx]; 
    break; 
} 

return data; 
} 
+0

我想出了什麼是錯,但它引發了更多的問題。結果集中只有96個條目,所以第1頁正常工作,第2頁請求80,但只有16條,所以它一直問。如果在服務器端填充空白記錄到結果並返回80,它將起作用,但下拉列表允許我保持向下滾動到頁面3,4,n,因爲它不知道有多少記錄。在kendo數據網格中分頁需要一個頁面才能返回總記錄數量,只是出於這個原因 - 這應該如何工作的下拉列表?解決了 – kpg

+0

- 服務器必須返回每個頁面的總數據量 - 請參閱下面的答案。 – kpg

回答

1

由數據源返回的數據必須與分頁數據一起返回記錄總數。這與kendo datagrid中的分頁一樣。因此,改變服務器的輸出:

{"total":X,"data":[...some data...]} 

和架構:

schema: { 
     total: function (response) { 
      return (JSON.parse(response).total); 
     }, 
     data: function (response) { 
      return (JSON.parse(response).data); 
     } 
    } 

解決了這個問題。

+0

幹得好!你能「接受」你的答案嗎? – Shai