Сортировка observableArray для одного из шаблонов - PullRequest
14 голосов
/ 06 августа 2011

У меня есть следующий вид модели:

function instance(id, FirstName){
    $.extend(this, {
        id: ko.observable(id || ''),
        FirstName: ko.observable(FirstName || '')
    });
}

У меня есть несколько экземпляров в наблюдаемом массиве:

 ko.observableArray([new instance(...), new instance(...), ...]

Со следующим шаблоном:

<ul data-bind='template: {name: "instanceTemplate", foreach: instances}'></ul>

И еще один шаблон:

<ul data-bind='template: {name: "anotherInsTmpl", foreach: instances}'></ul>

В первом ul мне нужно рендерить шаблоны без сортировки, во втором рендере сортировать по FirstName.

Может кто-нибудь объяснить, как это сделать?

1 Ответ

34 голосов
/ 06 августа 2011

Один из вариантов - добавить зависимый объект, который представляет отсортированный массив. Это будет выглядеть примерно так:

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);

Итак, сделайте нечувствительное к регистру сравнение значения FirstName, наблюдаемого для каждого элемента. Вернуть копию отсортированного массива (slice (0)) (не нужно сортировать реальный массив).

Пример здесь: http://jsfiddle.net/rniemeyer/93Z8N/

Примечание относительно Knockout версии 2.0 и выше: ko.dependentObservable теперь является ko.computed. См. Зависимые наблюдаемые

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...