如何有条件地将过滤器添加到ng-repeat内部指令中?

时间:2016-05-18 21:16:01

标签: javascript angularjs angularjs-directive angular-controller

我在几个视图上使用了一个元素指令。该指令针对每个资源重复进行。在资源列表中,就像这样:ng-repeat="resource in resources"

不同的页面控制器将通过在每个视图控制器中使用不同的$scope.resourceApiPath来确定将从API中提取哪些资源,指令控制器随后使用该$http进行ng-repeat调用。

这适用于显示不同资源的不同视图。例如,一个视图显示所有用户自己的资源,一个视图显示公共资源,一个视图显示用户已加星标的资源等。

唯一的问题是,对于我的某个观看次数,我想在ng-repeat="resource in resources | filter:resourceSearch.text"上添加过滤器,如下所示:$scope.filter == true;。有没有办法让我根据条件添加此过滤器,例如如果ng-repeat="resource in resources",则只返回常规.directive('resourcePanel', function() { return { restrict: 'E', scope: false, templateUrl: 'scripts/templates/resource-panel.html', controller: 'ResourcesPanelController' } })

这是我的指示:

ResourcesPanelController

指令中引用的$scope.resources = []; $scope.loadResources = function() { $scope.resources = []; // Empty the array $http.get('/api/resource' + $scope.resourceApiPath) .then(function(res) { $scope.resources = res.data.message; }); }; $scope.loadResources(); 具有以下内容:

scripts/templates/resource-panel.html

<div class="panel" ng-repeat="resource in resources"> {{resource.content}} </div> 元素模板如下所示:

td

谢谢!

3 个答案:

答案 0 :(得分:2)

我认为你可以选择四种方式之一,我更喜欢1和3,但它完全取决于你最适合自己的要求和代码标准。

自定义过滤器也是一个干净的解决方案。

  1. 如果您正在使用文本值进行过滤,那么,如果您没有设置resourceSearch.text的值,那么它就像没有过滤器一样好,所以如果resourceSearch.text存在,它将过滤,如果它未定义,然后没有过滤器。

    ng-repeat =&#34;资源中的资源|滤波器:resourceSearch.text&#34;

  2. 创建自定义过滤器并在那里处理。

  3. 如果您想创建自定义过滤器,请使用启用参数,您可以使用该参数打开和关闭过滤器http://plnkr.co/edit/ilPJPUZkBC7Y5OvGHWey?p=preview我已经找到了一个适合您需要的自定义过滤器

    ng-repeat="resource in resources | customfilter:resourceSearch.text:enable"
    
    1. 过滤控制器中的最终资源,并将过滤后的值传递给html

    2. 如果你的条件是ng-if,那么如果过滤器存在,那么就有一个循环,如果它不存在那么循环。

    3. 我希望它会有所帮助。

答案 1 :(得分:1)

您可以使用自定义过滤功能:

$scope.conditionalFilter = function(resource) {
    if (!$scope.filter) {
        return true;
    }

    // normal filter logic goes here, e.g.
    return resource.content.indexOf($scope.resourceSearch.text) >= 0;
};

然后在您的模板中使用自定义过滤器:

<div class="panel" ng-repeat="resource in resources | filter:conditionalFilter">
    {{resource.content}}
</div>

答案 2 :(得分:0)

<div ng-if="!filter" class="panel" ng-repeat="resource in resources">
    {{resource.content}}
</div>
<div ng-if="filter" class="panel" ng-repeat="resource in resources| filter:resourceSearch.text">
    {{resource.content}}
</div>

很抱歉没有描述,我有时会使用它,如果我很确定它只会出现一次,因为当你压扁它时..

<div ng-if="!filter" class="panel" ng-repeat="resource in resources">{{resource.content}}</div>
<div ng-if="filter" class="panel" ng-repeat="resource in resources|filter:resourceSearch.text">{{resource.content}}</div>

然后它看起来真的不那么糟糕。

但更完整的解决方案是设置自定义过滤器并注入&#39;过滤器&#39;

app.filter('conditionalFilter', function (filter) {
  return function (item, condition) {
    if(condition){
       return filter.bind(this,item).apply(this,[].slice.call(arguments,2));
    } else{ return item }
  };
});

然后

<div class="panel" ng-repeat="resource in resources| conditionalfilter : !!filter : researchSearch.text" >
    {{resource.content}}
</div>

Haven未经测试,如果我犯了错误,请告诉我。