我有一个计算的observable,它返回我的observableArray
的已过滤的排序版本,但排序根本不起作用。
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
答案 0 :(得分: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 :(得分:1)
您的sort
函数未正确调用observable:
.sort(function(a,b){
return a.name() == b.name() ? 0 : (a.name() < b.name() ? -1 : 1);
})
我也更新了您的fiddle,这似乎有效。