2015-07-27 4 views
4

Я пытаюсь отфильтровать список элементов, используя массив значений. До сих пор мне удалось фильтровать многочисленные поля в таблице, но я не смог фильтровать, используя многочисленные значения в одном столбце таблицы. Это plunker показывает этот объект фильтра используетсяУгловой фильтр по массиву значений

$scope.filters = { 
    user:{ 
    name:"John" 
    }, 
    status:{ 
    name: "Approved" 
    } 
}; 

Однако то, что я пытаюсь сделать, чтобы создать отфильтрованный список, основанный от этого фильтрует объект:

$scope.filters = { 
    user:{ 
    name:"John" 
    }, 
    status:{ 
    name: ["Approved", "For Review"] 
    } 
}; 

В основном я хочу список все Джонса, чей имя статуса либо «Утверждено», либо «Просмотр».

Возможно ли это сделать, используя фильтр фильтра «Угловой», или это задание для пользовательского фильтра?

+1

Я думаю, что это можно сделать только с помощью специального фильтра. Я просмотрел документы, но не смог найти нигде, указав использование двух выражений в фильтре. Поэтому я думаю, что вы должны использовать только собственный фильтр. – v1shnu

ответ

3

Для этого вам необходимо использовать специальный фильтр. Или вы можете также фильтровать по массиву состояния отдельно от фильтрации по имени пользователя:

$scope.filtered = $filter('filter')($scope.users, {user: $scope.filters.user}).filter(function(user) { 
    return $scope.filters.status.name.indexOf(user.status.name) > -1; 
}); 

Демо:http://plnkr.co/edit/KcP6bLujFnxFPXrVRfUp?p=preview

+0

Это действительно здорово! – v1shnu

+0

Похоже, это покажется трюком. Очевидно, эта функциональность была прекрасна в предыдущих версиях угловых, но при обновлении до 1.3 она сломалась. https://github.com/angular/angular.js/issues?utf8=%E2%9C%93&q=filterFilter. Спасибо за вашу помощь – abyrne85

1

Html: -

<table id="searchTextResults"> 
    <tr><th>Name</th><th>Phone</th><th>Status</th></tr> 
    <tr ng-repeat="friend in friends | filter: myFilter"> 
    <td>{{friend.user.name}}</td> 
    <td>{{friend.phone}}</td> 
    <td>{{friend.status.name}}</td> 
    </tr> 
</table> 

Пользовательский фильтр: -

$scope.myFilter = function (item) { 
    return item.status.name === 'For Review' || item.status.name === 'Approved'; 
}; 
+0

Это выглядит аккуратно –

2

Я думаю, что хороший подход состоит в том, чтобы инкапсулировать ll фильтрация логики о свойстве в самом фильтре и имя, которое фильтрует то, что он делает. В этом примере у вас есть два фильтра: по пользователю и по статусу. Так получилось, что в настоящее время вы только фильтруете одно свойство для каждого из этих фильтров: имя, но в будущем у вас может быть несколько свойств для фильтрации по пользователю и статусу.

Учитывая вышесказанное, я предлагаю следующие два фильтра для модуля:

app.filter('byStatus', function() { 
    return function(items, filter) { 
    var out = []; 
    //status.name 
    angular.forEach(items, function(item) { 
     if (filter.name.constructor != Array) { 
     if (filter.name == item.status.name) { 
      out.push(item); 
     } 
     } else if (filter.name.indexOf(item.status.name) > -1) { 
     out.push(item); 
     } 
    }); 
    return out; 
    }; 
}); 
app.filter('byUser', function() { 
    return function(items, value) { 
    var out = []; 
    //user.name 
    angular.forEach(items, function(item) { 
     if (item.user.name.indexOf(value.name) > -1) { 
     out.push(item); 
     } 
    }); 
    return out; 
    }; 
}); 

Plunker: http://plnkr.co/edit/g3ERmycps8Fg6trE1NfN?p=preview

Есть два $ фильтр звонков, но это нормально, я всегда поощряю ясность кода над производительностью до начните с.

+0

Это было бы очень хорошим решением, но данные, которые я вставлял в plunkr, это всего лишь небольшая выборка всего набора данных. В идеале я могу просто фильтровать любое поле, а не создавать специальные фильтры для определенных полей. Тем не менее, мне нравится этот подход для более мелких и более статических данных. Я собираюсь реализовать это в другой области приложения. Спасибо – abyrne85

+0

Я действительно задавался вопросом, был ли набор данных неполным. Пожалуйста! – GloriousMess