Filtering nested objects in ng-repeat with a search input field

后端 未结 2 1540
难免孤独
难免孤独 2020-12-10 19:00

I am trying to filter nested objects in ng-repeat by using a search textbox.

Given the following object:

$scope.items = {
    \"1\": {
        name:          


        
相关标签:
2条回答
  • 2020-12-10 19:07

    I've finally got the answer to my own question.

    I only had to create my own filter and check if the properties inside the object have the desired value by using regular expressions:

    app.filter('customSearchFilter', function() {
    return function(input, term) {
        var regex = new RegExp(term || '', 'i');
        var obj = {};
        angular.forEach(input, function(v, i){
          if(regex.test(v.name + '')){
            obj[i]=v;
          }
        });
        return obj;
      };
    });
    

    And apply it in the HTML this way:

    <input type="text" ng-model="searchName" />
    <ul>      
      <li ng-repeat="(key, val) in items | customSearchFilter:searchName">Both {{key}} and {{val.name}}</li>
    </ul>
    

    I created this Plunker to show my solution in action

    0 讨论(0)
  • 2020-12-10 19:27

    If you don't need to reuse your filter anywhere else, you can write your filtering function in controller.

    scope.customSearchFilter = function(term){
        return function(item) {
            var regex = new RegExp(term || '', 'i');
            return regex.test(item.name + '');
        };
    };
    

    Filter argument is a single item, not an array.

    Here is examples. 1st variant is with model, and 2nd with plain scope:

    https://plnkr.co/edit/ELH8S5GymG8cHfOJqD9G

    0 讨论(0)
提交回复
热议问题