Knockout.js 将observablearray索引值添加到observablearray

Knockout.js 将observablearray索引值添加到observablearray,knockout.js,knockout-mapping-plugin,ko.observablearray,Knockout.js,Knockout Mapping Plugin,Ko.observablearray,我有一个包含映射Json数据的可观察数组。数据已按“性能”排序 我需要做的是向数组中添加排名,以便我的foreach呈现编号的排名。到目前为止,我一直在使用$index,它工作得很好,直到我使用排序和分页扩展程序来更改数组索引。我认为最好的方法是将每个索引值添加到数组中,对吗 有些事情告诉我这应该很简单,但我还没有找到正确的方法 viewModel.integerlists = ko.observableArray([]); function IntegerLists(data) {

我有一个包含映射Json数据的可观察数组。数据已按“性能”排序

我需要做的是向数组中添加排名,以便我的
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);
});

如果您使用分页,那么简单的解决方案是记住您在哪一页,只显示(第1页)*(每页的项目数)+$index

若你们使用过滤,那个么你们在客户端并没有什么可以做的,因为你们不会得到被过滤掉的项目,除非你们在客户端保留所有数据,然后过滤掉它们,在我看来,这是不好的。若您转到服务器获取数据,我所能看到的就是从数据库中按性能排序获取所有项,然后使用扩展类:

public class ExtendedMyClass
{
  public MyClass theObject{get;set;}
  public int rank{get;set;}
}
然后像那样把它还给我。这样,您的服务器将拥有最新和最准确的数据,处理速度非常快,并且只返回您需要的数据。当然,在添加排名之后,您应该处理如何过滤数据——您需要哪个页面以及应用了哪些过滤器

另一方面,如果客户机上有所有数据,则可以简单地对其进行迭代并动态添加秩。您编写的代码对它们进行了排序,因此应执行以下代码:

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

我很幸运地得到了一个
索引的
扩展,它订阅了observableArray,并在每个扩展上更新了一个索引。回答的第二部分:谢谢RP-这很有趣,但并不能真正解决我的问题。如果单击“分数”链接,则会切换分数顺序,但索引保持不变。我不需要索引,我只需要一种基于分数对数组成员进行排序的方法。