将observablearray索引值添加到observablearray

时间:2013-11-22 01:55:46

标签: knockout.js knockout-mapping-plugin ko.observablearray

我有一个包含映射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 个答案:

答案 0 :(得分:0)

如果您使用分页,那么简单的解决方案就是记住您所在的页面,只显示(第1页)*(number_of_items_per_page)+ $ 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++;
});