0

我有一個包含映射Json數據的可觀察數組。數據已按「性能」排序。將observablearray索引值添加到observablearray

我需要做的是給陣列添加一個排名,所以我的foreach呈現編號的排名。到目前爲止,我一直在使用$ index,直到我使用排序和分頁擴展程序來更改數組索引。我是否認爲最好的方法是將每個索引值添加到數組中?

東西告訴我這應該很簡單,但我還沒有找到正確的方法。

viewModel.integerlists = ko.observableArray([]); 

function IntegerLists(data) { 
    this.IntegerListID = data.IntegerListID; 
    this.Performance = data.Performance; 
    this.Direction = data.Direction; 
    this.Integers = ko.observableArray(data.Integers); 
} 

$.getJSON("/Home/GetIntegerLists", function (allData) { 
    var mappedIntegers = $.map(allData, function (item) { return new IntegerLists(item) }); 
    viewModel.integerlists(mappedIntegers); 
}); 
+0

我有一個'索引'擴展名訂閱了observableArray,並通過更新每個索引一個好運。這個答案的第二部分:http://stackoverflow.com/questions/12229578/knockoutjs-access-index-of-item-in-array-from-within-the-javascript-template/12230148#12230148 –

+0

謝謝RP - 這很有趣,但並不能真正解決我的問題。 http://jsfiddle.net/zGmcg/26/如果您點擊'分數'鏈接,評分順序會切換,但索引保持不變,因爲它應該如此。我不一定需要索引,我只需要根據分數對陣列成員進行排名。 – user1405195

回答

0

如果使用分頁,然後簡單的解決辦法是記住你是哪個網頁上只顯示(頁面-1)*(number_of_items_per_page)+ $指數。

如果您使用過濾,那麼在客戶端就沒有什麼可以做的,因爲您不會收回被過濾掉的項目,除非您將所有數據保留在客戶端上,然後將其過濾掉,在我看來,不好。如果你去到服務器的數據,所有我可以看到做的就是從性能下令數據庫中的所有項目,然後使用擴展類:

public class ExtendedMyClass 
{ 
    public MyClass theObject{get;set;} 
    public int rank{get;set;} 
} 

,並返回它這樣。這樣,您的服務器將擁有最新最準確的數據,處理速度非常快,並只會返回您所需的數據。當然,在添加排名之後,您應該處理如何過濾數據 - 您想要的頁面以及您應用的過濾器。另一方面,如果客戶端上有所有數據,則只需遍歷它並動態添加排名。你寫他們排序,所以下面的代碼應該這樣做:

var counter = 1; 
mappedIntegers.forEach(function (singleInteger){ 
    singleInteger.rank = counter; 
    counter++; 
});