ko.utils.arrayFilter无法正常工作

时间:2014-02-06 15:43:58

标签: javascript knockout.js

我试图通过省略以前列表中已有的用户来过滤数组:

  

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()时,我只收到用户列表

1 个答案:

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