排序数组而不重绘内容

时间:2013-10-17 08:24:35

标签: javascript sorting knockout.js

我正在尝试按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

1 个答案:

答案 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;
    });   
};

我希望它有所帮助。