AngularJS如何在ng-repeat中忽略隐藏的表行但是保持增量?

时间:2017-05-15 15:17:49

标签: javascript angularjs angularjs-ng-repeat ignore

我有一个ng-repeat,它会生成一系列表行。一列标题为“任务状态”,如果状态显示“已完成”,我认为没有理由显示它,因为作业已完成。

我用了ng-show = values!= 0;这最初起作用,直到我添加一个增量来编号任务。

我发现数据=“完成”并没有从DOM中完全删除,仍然在列表中进行重新设置,从而破坏了增量。见下图:

list increment disruption

因此第2行和第3行是等于“完成”的数据。我该怎么做才能忽略它们?

这是我的标记:

<table class="backlog table table-bordered table-striped" width="100%" border="0" cellpadding="0" cellspacing="0" summary="Our Jira Backlog">
      <tbody>
         <tr>
             <th>Priority</th>
             <th>Task Priority Score</th>
             <th>Task Summary</th>
             <th>Due date</th>
             <th>Task Status</th>
         </tr>
         <tr ng-repeat="issue in issues | orderBy: '-fields.customfield_12401'" ng-if="issue.fields.status.statusCategory.name != 'Done'">
         <td>{{ $index + 1 }}</td>
         <td>{{ issue.fields.customfield_12401 }}</td>
         <td>{{ issue.fields.summary }}</td>
         <td>{{ issue.fields.customfield_13700 }}</td>
         <td>{{ issue.fields.status.statusCategory.name }}</td>
         </tr>
      </tbody>
  </table>

所以来自“issue.fields.status.statusCategory.name”的任何内容都需要被忽略,因此优先级(第一列)为1,2,3,4,5等,并且不显示“完成”任务状态列。

2 个答案:

答案 0 :(得分:1)

我认为处理这种情况的最佳方法是首先过滤数组。您可以在ng-repeat表达式中过滤所有数组,只需保留可在模板中引用的过滤器输出的变量(如果需要)。

查看此SO问题的答案:AngularJS - how to get an ngRepeat filtered result reference

编辑:澄清我认为您应该将ng-if更改为自定义过滤器,并在ng-repeat索引过滤后的数组之前应用它:

<tr ng-repeat="issue in (filteredIssues = (issues | orderBy: '-fields.customfield_12401' | filter: customFilterFunction))">

  <td>{{ $index + 1 }}</td>

答案 1 :(得分:0)

您应该能够将ng-if作为过滤器,并且只需将$index移至$index作为track by,就可以继续增加ng-repeat。 :

<tr ng-repeat="issue in (issues | orderBy: '-fields.customfield_12401') track by $index" ng-if="issue.fields.status.statusCategory.name != 'Done'">

您的$index应与正在执行的for-each的索引匹配,即使已实施ng-if

更新:我相信我的问题解释错了。您希望$index跳过您&#34;已完成&#34;行?那不清楚......

正如@ Ericson578建议的那样,您应该自定义filter以删除&#34;完成&#34;你的数组中的行。

<tr ng-repeat="issue in ((issues | removeDoneRows) | orderBy: '-fields.customfield_12401') track by $index" >

...以及您的removeDoneRows过滤器(请为此提供更好的名称):

angular.module('myFilter', [])
.filter('removeDoneRows', function() {
    return function(arr) {
        var retval = [];
        for(var i = 0; i < arr.length; i++){
            if(arr[i].fields.status.statusCategory.name.toLowerCase() != "done")
                retval[retval.length] = arr[i];
        }
        return retval;
    };
})