2014-02-06 4 views
1

Я пытаюсь фильтровать массив, опуская пользователей, которые уже в предыдущем списке:ko.utils.arrayFilter не работает должным образом

перенаправление: Том, Тим, Джим, Джилл
Список пользователей задается: Том, Джилл

и с помощью другого члена я был в состоянии использовать этот фильтр массива, но проблема в том, что результат фильтрации такой же, как Список пользователи задаются: Том, Джилл и я хочу результат фильтрации быть 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; 
     }); 
    }); 
} 

У меня есть два разных метода получения, один для получения пользователей, а другой для полных пользователей - они одинаковы, единственное различие заключается в том, что идентификатор, который я передаю, одному и другому не требует переданного id.

Просмотр данных связываются

<div data-bind="foreach: _FilteredUsers"> 
    <span data-bind="text: Name"></span> 
</div> 

как я могу изменить код, чтобы мой результат Тим, Джим?

Текущие результаты основаны на коде выше - я получаю FullUsers, включая тот, который я не хочу показывать. когда я переворачиваю Users()10 и FullUsers() Я только получаю Список пользователей

+3

Пожалуйста, напишите фактический синтаксически правильный код! Нет метода 'ArrayFilter', он называется' arrayFilter', а также нет 'ArrayIndexOf', он называется' arrayIndexOf'! – nemesv

+0

@nemesv Извините! рассматривая синтаксически правильный код - поскольку я уже получаю результаты, моя озабоченность связана не с ошибкой в ​​синтаксисе, а с большей логической перспективой, поэтому я ввел без полного синтаксиса. – user3244544

+0

Этот код выглядит правильно, делаете ли вы что-то еще для вычисленного? – noname

ответ

2

Вам нужно будет искать ObservableArray пользователей для соответствующего элемента с помощью arrayFirst (возвращает true, если какая-либо из функций фильтра возвращает true). Поскольку вы хотите, чтобы пользователи из полного списка, которые НЕ находятся в обычном списке, добавьте ! в массив First. Если атрибут для фильтрации является наблюдаемым, обязательно добавьте () в конец атрибута.

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 
     }); 
}); 
Смежные вопросы