为其中一个模板排序observableArray

And*_*rey 14 sorting knockout.js

我有以下视图模型:

function instance(id, FirstName){
    $.extend(this, {
        id: ko.observable(id || ''),
        FirstName: ko.observable(FirstName || '')
    });
}
Run Code Online (Sandbox Code Playgroud)

我在observableArray中有一些实例:

 ko.observableArray([new instance(...), new instance(...), ...]
Run Code Online (Sandbox Code Playgroud)

使用以下模板:

<ul data-bind='template: {name: "instanceTemplate", foreach: instances}'></ul>
Run Code Online (Sandbox Code Playgroud)

另一个模板:

<ul data-bind='template: {name: "anotherInsTmpl", foreach: instances}'></ul>
Run Code Online (Sandbox Code Playgroud)

首先,ul我需要渲染模板而不进行排序,在第二个渲染中按FirstName排序.

任何人都可以解释如何做到这一点?

RP *_*yer 34

一种选择是添加一个代表已排序数组的dependentObservable.它看起来像:

viewModel.sortFunction = function(a, b) {
        return a.FirstName().toLowerCase() > b.FirstName().toLowerCase() ? 1 : -1;  
};

viewModel.sortedInstances = ko.dependentObservable(function() {
    return this.instances.slice().sort(this.sortFunction);
}, viewModel);
Run Code Online (Sandbox Code Playgroud)

因此,对每个项的FirstName observable的值进行不区分大小写的比较.返回已排序的数组(slice(0))的副本(不想对实际数组进行排序).

此处示例:http://jsfiddle.net/rniemeyer/93Z8N/

关于Knockout Version 2.0及更高版本的注意事项:ko.dependentObservable现在是ko.computed.参见Dependent Observables