2013-03-21 2 views
1

У меня есть вычисленный наблюдаемый, который возвращает фильтрованную, отсортированную версию моего observableArray, но сортировка вообще не работает.Вычисленный, который возвращает отсортированный наблюдаемый массив

Вот My fiddle

String.prototype.contains = function (value) { 
    return this.indexOf(value) != -1; 
}; 

function Item(data) { 
    this.name = ko.observable(data); 
} 

function ViewModel() { 
    var self = this; 
    this.items = ko.observableArray([new Item('John'), new Item('Pat')]); 
    this.filterValue = ko.observable(); 

    this.filteredItems = ko.computed(function() { 
     var filterValue = self.filterValue(); 

     if(!filterValue) 
      return self.items(); 

     return ko.utils.arrayFilter(self.items(), function(){ 
      return item.name().toLowerCase().contains(filterValue.toLowerCase()); 
     }).sort(function(a,b){ 
      return a.name == b.name ? 0 : (a.name < b.name ? -1 : 1); 
     }); 
    }); 
} 

ОТВЕТ Вот обновление fiddle

+1

Вы не объявляя и установка «Я» переменную в любом месте. * edit * О, вы в скрипке - это неприятно, когда вопросы содержат неточный код :( – Pointy

+0

исправлено, извините за это – bflemi3

ответ

3

Как отметил @Paul Manzotti, ваша функция сортировки не имеет доступа к свойствам «имя» правильно. Кроме того, ваш «filterValue» равен undefined, поэтому ваша функция выходит до того, как она попадет в сортировку.

Что-то, как это будет сделать его работу:

var filtered = filterValue ? ko.utils.arrayFilter(self.items(), function(item){ 
     return item.name().toLowerCase().contains(filterValue.toLowerCase()); 
    }) : self.items(); 

    return filtered.sort(function(a,b){ 
     return a.name() == b.name() ? 0 : (a.name() < b.name() ? -1 : 1); 
    }); 
+1

ok Я вижу, что я делаю неправильно, если 'filterValue' не имеет значения, то я просто возвращаю массив, который не отсортирован, но если есть' filterValue', то он сортируется. – bflemi3

1

Ваша sort функция не вызывая наблюдаемыми правильно:

.sort(function(a,b){ 
     return a.name() == b.name() ? 0 : (a.name() < b.name() ? -1 : 1); 
    }) 

Я обновил свой fiddle тоже, и это кажется Работа.

+0

Нет, это не сработает, «Пэт» не должен появляться до «Брэндона». – Pointy

+0

Сортировка только тогда, когда в вопросе применяется фильтр, так что это то, что я реализовал. Введите a в поле фильтра, и Брэндон пойдет перед паттом –

+0

Да, это правда, довольно сложно сказать, чего хочет OP: -) – Pointy

Смежные вопросы