2013-10-17 40 views
1

我试图通过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> 

一切工作正常,但改变网络属性时,用户分类和“用户已更改”已记录。我知道这是因为我正在改变原始数组。我想要的是 - 不改变原始数组,只是显示它排序(像角does it

+0

使用过滤器不能排序。我想如果你使用过滤器,你会得到单独的数组,只有登录用户。 –

+0

我不需要只记录用户,我需要所有,但排序。 – karaxuna

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

我希望它有帮助。

+0

非常感谢,它帮助:) – karaxuna