【问题标题】:Use NG-Repeat expression as filter value使用 NG-Repeat 表达式作为过滤器值
【发布时间】:2016-04-18 14:56:05
【问题描述】:

我得到了一个很好的重复,其中包含一个与外键元素连接的列,因此它看起来像这样想要通过搜索进行扩展。

<input type="text" ng-model="search" placeholder="Search On Studio Name">

<div ng-repeat="cd in cds | filter : search">
 <div>{{cd.colorcode;}}</div>
 <div>{{cd.studio[0].name}}</div>
</div>

问题是当我尝试添加示例时,我没有得到工作室名称的过滤结果:

| filter : search.{cd.studio[0].name}

如何处理第二个连接的外键列?

作为一个单独的问题,我也想通过单击按钮(如果/否则)来过滤结果,所以如果我按下按钮,我将过滤掉所有的“cd.studio[0].name”直接用第一个字母A,用这样的按钮

<button ng-click="letter='[A]'">A</button>
| filter : search.{cd.studio[0].name} OR letter: StartsWith

【问题讨论】:

    标签: angularjs search angularjs-ng-repeat angularjs-filter


    【解决方案1】:

    将谓词函数传递给过滤器,并在控制器中实现该谓词函数:

    <div ng-repeat="cd in cds | filter : isAccepted">
    
    $scope.isAccepted = function(cd) [
        return (cd.studio[0].name.toLowerCase().indexOf($scope.search.toLowerCase()) >= 0  || 
                ...);
    };
    

    【讨论】:

    • 如果只有错误带有错误消息......我们可以知道问题所在,而不必猜测。发布错误消息。
    • hahaha ok 是的,这里是:angular.js:9997 TypeError: Cannot read property 'toLowercCase' of undefined -- 我把这个添加到 js 中:$scope.isAccepted = function(movie) { return (movie.ProgramMetadata[0].ProgramName.toLowerCase().indexOf($scope.search.toLowercCase()) >= 0); };
    • 这是一个错字,现在已修复:toLowercCase -> toLowerCase。您的过滤器功能还需要处理使用未输入任何内容的情况。我会将 $scope.search 初始化为空字符串,而不是将其保留为未定义。
    • 现在出现另一个错误:$scope.search.toLowerCase 不是函数
    • 谢谢JB,我让它工作了,我不得不更改显然出错的角度版本。 plnkr 帮了很多忙,感谢您的时间和帮助。问候
    【解决方案2】:

    你应该使用如下过滤器:

    <input type="text" ng-model="search.studio[0].name" placeholder="Search On Studio Name">
    
    <div ng-repeat="cd in cds | filter : search">
        <div>{{cd.colorcode;}}</div>
        <div>{{cd.studio[0].name}}</div>
    </div>
    

    如果您想通过单击按钮来实现这一点:

    <input type="text" ng-model="originalSearch.studio[0].name" placeholder="Search On Studio Name">
    <button ng-click="searchFunc()" > Search it!</button>
    <div ng-repeat="cd in cds | filter : finalSearch">
        <div>{{cd.colorcode;}}</div>
        <div>{{cd.studio[0].name}}</div>
    </div>
    

    在控制器中:

    $scope.searchFunc = function(){
      $scope.finalSearch = $scope.originalSearch;
    }
    

    【讨论】:

    • 我以前也有这个 (( ng-model="search.studio[0].name" )) 但它给了我一个错误这样的“angular.js:9997 TypeError: Cannot read未定义的属性“名称”
    • 你确定cd.studio[0] 存在吗!?试试“console.log(cds)”?
    • 是的,如果我只使用搜索,我会在 ng-repeat 中获得正确的数据,但我猜它会搜索所有可用数据,因为很多时候它看起来没有意义,所以我想仅搜索工作室名称。
    猜你喜欢
    • 2014-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-05
    相关资源
    最近更新 更多