代码之家  ›  专栏  ›  技术社区  ›  Steve

Angularjs:ng在对象数组中重复筛选对象

  •  4
  • Steve  · 技术社区  · 6 年前

    http://plnkr.co/edit/XAghimH20qwxQGjO42gP?p=preview

    我有一个对象数组$scope.menus

        $scope.menus = [
              {   
                name: 'Access',
                submenu: [
                  { name: 'User List'},
                ]
              },
              {
                name: 'Organization',
                submenu: [
                  { name: 'City List'}, 
                  { name: 'State List'},
                  { name: 'Country List'},
                ]
              },
    {
                name: 'Upload Logs',
                submenu: [
                    { name: 'Inventory Uploads'},
                ]
            },
            {
                name: 'Bulk Logs',
                submenu: [
                    { name: 'Bulk Renewals'},
                ]
            },
            ];
    

    当搜索时,搜索外部菜单 Access Organization ,只返回搜索的项目。

    City List ,结果我得到了所有其他对象,包括 城市列表 . 城市列表 .

    我观察到,对于嵌套的对象数组,过滤器不起作用。

    我可能错了。请引导我学习新知识。

    更新 @Vivek解决方案奏效了。但现在我面临另一个问题。我在现有数组中添加了一些其他数组。
    当我打字时 Bulk upload 在搜索字段中,将显示子菜单。但我一输入第二个单词(例如 Bulk logs upload logs ),子菜单消失。

    如果它是在第一个字打出来的时候出现的,为什么在第二个字打出来的时候就消失了呢?为什么会这样?

    更新

    3 回复  |  直到 6 年前
        1
  •  2
  •   Aragorn    6 年前

    过滤器仅应用于第一个循环,您需要在子菜单上添加过滤器 ng-repeat 这样地:

    <html>
      <head>
        <title>AngularJS ng-repeat filter</title>
        <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.9/angular.js"></script>
        <script src="script.js"></script>
        <link rel="stylesheet" type="text/css" href="style.css">
      </head>
    
      <body ng-app="app">
    
      <div ng-controller="democontroller">
    
          <input type="text" placeholder="Search text" ng-model="menuSearch">
          <ul>
            <li ng-repeat="menu in menus | filter : menuSearch">
                <span href="#">{{menu.name}}</span>
                <ul>
                    <li ng-repeat="submenu in menu.submenu | filter: menuSearch"> <!--Notice filter added here-->
                        <a href="#">{{submenu.name}}</a>
                    </li>
                </ul>
            </li>
          </ul>
    
        </div>
    
      </body>
    </html>
    

    对于更新的用例,这可能会有所帮助,基本上子菜单上有过滤器,但如果子菜单处于活动状态或搜索包含菜单中的任何文本,则会显示主菜单:

    <html>
      <head>
        <title>AngularJS ng-repeat filter</title>
        <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.9/angular.js"></script>
        <script src="script.js"></script>
        <link rel="stylesheet" type="text/css" href="style.css">
      </head>
    
      <body ng-app="app">
    
      <div ng-controller="democontroller">
    
          <input type="text" placeholder="Search text" ng-model="menuSearch">
          <ul>
            <li ng-repeat="menu in menus"  ng-if="(menu.submenu | filter: menuSearch).length > 0  || (menu.name.includes(menuSearch))">
                <span href="#">{{menu.name}}</span>
                <ul>
                    <li ng-repeat="submenu in menu.submenu | filter : menuSearch">
                        <a href="#">{{submenu.name}}</a>
                    </li>
                </ul>
            </li>
          </ul>
    
        </div>
    
      </body>
    </html>
    
        2
  •  4
  •   Farinaz    6 年前
      <input type="text" placeholder="Search text" ng-model="menuSearch">
      <ul>
        <li ng-repeat="menu in menus | filter : menuSearch">
            <span href="#">{{menu.name}}</span>
            <ul>
                <li ng-repeat="submenu in menu.submenu | filter : menuSearch">
                    <a href="#">{{submenu.name}}</a>
                </li>
            </ul>
        </li>
      </ul>
    
    </div>
    
        3
  •  3
  •   Hitesh Kansagara    6 年前

    你还必须在子菜单中写下filter,重复如下所示,

    <html>
      <head>
        <title>AngularJS ng-repeat filter</title>
        <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.9/angular.js"></script>
        <script src="script.js"></script>
        <link rel="stylesheet" type="text/css" href="style.css">
      </head>
    
      <body ng-app="app">
    
      <div ng-controller="democontroller">
    
          <input type="text" placeholder="Search text" ng-model="menuSearch">
          <ul>
            <li ng-repeat="menu in menus | filter : menuSearch">
                <span href="#">{{menu.name}}</span>
                <ul>
                    <li ng-repeat="submenu in menu.submenu | filter : menuSearch">
                        <a href="#">{{submenu.name}}</a>
                    </li>
                </ul>
            </li>
          </ul>
    
        </div>
    
      </body>
    </html>