javascript - 对数组进行排序而不重绘内容

标签 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 )

最佳答案

只需创建一个新的计算来填充用户的排序列表。

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

希望对您有所帮助。

关于javascript - 对数组进行排序而不重绘内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19421614/

相关文章:

javascript - 如何使用 Bacon.js 返回 ajax 响应对象?

javascript - 如何按字符串中 'word' 出现的升序对字符串数组进行排序? javascript

python - 对齐两个字符串 : Bigramm/Buble

javascript - 在 Knockout 中读取复杂对象的计数

knockout.js - 如何在 Knockout JS 中显示仅包含数组列表中选定项目的 View ?

javascript - 将 HTML 文件附加到 JS 文件

javascript - 使用 javascript 的 AJAX 与 Php 表单

javascript - jQuery : extract tag from data

java 二维数组 - 排序和搜索

javascript - 通过点击选择列表中的项目并进行 knockout