2013-11-14 3 views
0

Как я могу отсортировать наблюдаемый массив с вычисленным полем в модели knockoutjs? Я хочу сортировать с вычисленным полем. Вот поле:Сортировка вычисленного поля модели knockoutjs

self.filteredCases = ko.computed(function() { 
     return ko.utils.arrayFilter(self.cases(), function (onecase) { 
      return ((self.eventFilter() == 1 && onecase.Status() == self.statusFilter()) 
       || (self.eventFilter() != 1 && onecase.Status() == self.eventFilter()) 
       || ((self.eventFilter() == 1 && self.statusFilter() == 0) 
        && (onecase.Status() == 1 || onecase.Status() == 2 || onecase.Status() == 3 || onecase.Status() == 4)) 
       ); 
     }); 
    }); 

Поэтому я хочу сортировать только отфильтрованные элементы, а не все предметы. Сортировка элементов работает, но похоже, что ko.computed не получил метод сортировки.

У меня есть несколько столбцов, здесь один метод фильтра:

self.orderById = function (direction) { 
    self.cases.sort(function (left, right) { //Working 
    //self.filteredCases().sort(function (left, right) { //Do nothing 
     return direction ? 
      left.CaseId() > right.CaseId() ? 1 : -1 
      : left.CaseId() < right.CaseId() ? 1 : -1; 
    }); 
}; 

Пожалуйста, советы,

+0

Вы, наверное, как и self.filteredCases.sort нужно self.filteredCases(). Сортировать – Joe

ответ

0

Это довольно просто. Просто отсортируйте свой фильтрованный массив.

self.filteredCases = ko.computed(function() { 
    var filter = ko.utils.arrayFilter(self.cases(), function (onecase) { 
     return ((self.eventFilter() == 1 && onecase.Status() == self.statusFilter()) 
      || (self.eventFilter() != 1 && onecase.Status() == self.eventFilter()) 
      || ((self.eventFilter() == 1 && self.statusFilter() == 0) 
       && (onecase.Status() == 1 || onecase.Status() == 2 || onecase.Status() == 3 || onecase.Status() == 4)) 
      ); 
    }); 

    return filter.sort(); 

    //Optionally, you can pass a function to sort, 
    //Which takes a left and right parameter 
    //And returns -1/1 for before/after 
    return filter.sort(function(left, right) { 
     return left.Status() > right.Status() ? 1 : -1; 
    }) 
}); 
+0

Это может быть решение, но у меня есть несколько столбцов, и все столбцы можно сортировать, а не только статус. Я отфильтровывал случаи со статусом, но должен был заказать их по другим свойствам (Id, Name, Owner, Date и т. Д.). – martonx

+0

Затем замените 'Status' внутри метода сортировки на любое свойство, которое вы сортируете. Или используйте другое наблюдаемое для отслеживания свойства, которое вы хотите отсортировать, а затем используйте * this * в методе сортировки. Это довольно гибко. – Tyrsius

+0

Tyrsius благодарит вас за идеи. Как насчет сортировки меняется, но фильтрация - нет? Тогда ваш метод сортировки не будет работать. – martonx

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