我试图通过省略以前列表中已有的用户来过滤数组:
FullList:Tom,Tim,Jim,Jill
UsersList:Tom,Jill
并且在另一个成员的帮助下我能够使用这个数组过滤器,但问题是过滤结果与usersList相同:Tom,Jill和我希望过滤结果为Tim,Jim
var viewModel = function(data){
var _self = {};
var FullUsers = ko.observableArray([]);
var Users = ko.observableArray([]);
_self.UsersList = function(data){
$.each(data, function(index, user) {
_self.Users.push(new userViewModel(user));
}
}
_self.FullList = function(data){
$.each(data, function(index, user) {
_self.FullUsers.push(new userViewModel(user));
}
}
this._FilteredUsers=ko.computed(function() {
return ko.utils.arrayFilter(_self.FullUsers(), function(item) {
return ko.utils.arrayIndexOf(_self.Users(), item)<0;
});
});
}
我有两个不同的get方法,一个用于获取用户,另一个用于完全用户 - 它们都是相同的唯一区别是我传入一个的ID而另一个不需要传递的id。
查看数据绑定
<div data-bind="foreach: _FilteredUsers">
<span data-bind="text: Name"></span>
</div>
我怎么能改变代码所以我的结果是Tim,Jim?
基于上述代码的当前结果 - 我得到的FullUsers包括曾经不想展示的内容。当我翻转Users()
和FullUsers()
时,我只收到用户列表
答案 0 :(得分:2)
您需要使用arrayFirst在Users ObservableArray中搜索匹配项(如果任何filter函数返回true,则返回true)。由于您希望完整列表中的用户不在正常列表中,因此您向arrayFirst添加!
。如果要过滤的属性是可观察的,请确保将()
添加到属性的末尾。
this._FilteredUsers=ko.computed(function() {
return ko.utils.arrayFilter(_self.FullUsers(), function(fuitem) {
return !ko.utils.arrayFirst(_self.Users(), function(item) {
return fuitem.Name() === item.Name(); //replace .Name with the attribute you want to match on
});
});