我正在尝试按online
属性对用户进行排序:
var userViewModel = function(data){
var self = this;
self.name = ko.observable(data.name);
self.online = ko.observable(data.online);
};
var mainViewModel = function(data){
var self = this;
self.users = ko.observableArray(data.users.map(function(user){
var model = new userViewModel(user);
model.online.subscribe(function(){
self.users.sort(function (a, b) { return b.online() - a.online(); });
});
return model;
}));
self.users.subscribe(function(){
console.log('users have changed');
});
};
HTML:
<div data-bind="foreach: users">
Online: <div data-bind="text: online"></div>
<div data-bind="text: name"></div>
</div>
一切正常,但在更改在线资产时,会对用户进行排序并记录“用户已更改”。我明白这是因为我正在改变原始阵列。我想要的是 - 不要改变原始数组,只显示它排序(如angular does it)
答案 0 :(得分:1)
只需创建一个新的计算器,用于填充已排序的用户列表。
var mainViewModel = function(data){
var self = this;
self.users = ko.observableArray(data.users.map(function(user){
var model = new userViewModel(user);
return model;
}));
self.sortedUsers = ko.computed(function(){
var users = self.users();
users.sort(function (a, b) { return b.online() - a.online(); });
return users;
});
};
我希望它有所帮助。