【问题标题】:Filtering nested objects in ng-repeat with a search input field使用搜索输入字段过滤 ng-repeat 中的嵌套对象
【发布时间】:2017-06-04 06:23:20
【问题描述】:

我正在尝试使用搜索文本框过滤 ng-repeat 中的嵌套对象。

给定以下对象:

$scope.items = {
    "1": {
        name: "First Item",
        tag: "first"
    },
    "2": {
        name: "Second Item",
        tag: "second"
    }
};

我想做这样的事情:

<input type="text" name="serchBox" ng-model="searchByName">
<p ng-repeat="(key, values) in items | filter:{name: searchByName}">
    Using both {{key}} and {{values.name}}
</p>

这确实行不通。我尝试了很多东西,但无法使其正常工作。 我不想更改我的对象。我搜索了很多,但没有找到适合我需要的东西。

【问题讨论】:

    标签: javascript angularjs object angularjs-ng-repeat angularjs-filter


    【解决方案1】:

    我终于找到了自己问题的答案。

    我只需要创建自己的过滤器并使用正则表达式检查对象内的属性是否具有所需的值:

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

    并以这种方式将其应用到 HTML 中:

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

    我创建了这个Plunker 来展示我的解决方案

    【讨论】:

      【解决方案2】:

      如果您不需要在其他任何地方重复使用您的过滤器,您可以在控制器中编写您的过滤功能。

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

      过滤器参数是单个项目,而不是数组。

      这里是例子。第一个变体是模型,第二个是普通范围:

      https://plnkr.co/edit/ELH8S5GymG8cHfOJqD9G

      【讨论】:

      • 该项是过滤器内部的一个数组,当我们在Plunker中编辑过滤器函数以按照您建议的方式传递参数时,它不起作用。此外,通过将函数从新过滤器更改为范围变量,会引发“循环依赖”错误。您能否提供一个活生生的例子,说明您的解决方案按预期工作?
      • 在变量名中使用点是一个好习惯,例如ctrl.items。猜猜你的错误是由变量冲突引起的。我会用例子更新我的答案。
      • 您的示例显示了一个 array 对象,而我的意思是一个 object 对象。这不是这个问题的初衷,所以这个例子是无效的。
      • 好吧,你的问题并没有指向你问题的核心。我的示例过滤嵌套对象。数组对象。第一件事是 - ng-repeat 不支持对象。所以也许将你的对象转换成数组会更简单?无论如何,我的观点只是关于另一种过滤方式。不是答案候选人。 :D
      • 我在问题中明确写了对象,以避免与对象数组混淆。我想过滤一个对象,以便不必转换我的代码的任何变量 :) 无论如何,感谢您的建议!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-15
      相关资源
      最近更新 更多