在ng-repeat&中使用条件进行角度$ index编号UI可排序

时间:2014-08-21 13:36:58

标签: angularjs angularjs-ng-repeat angular-ui jquery-ui-sortable angular-filters

我在列出数组中的所有项目时尝试实现自定义编号。

数组中的所有项目都使用ng-repeat& amp; ui.sortable。

编号必须以这样一种方式完成:对于数组项"语句",不应增加计数&显示。否则我可能会使用$ index而不是外部计数。

对于任何其他数组项,应增加计数&显示。

让我获得最接近结果的解决方案是将$ index传递给控制器​​中编写的过滤器函数。

就像在HTML中一样:

<li ng-repeat="question in questions">

<div class="no"> {{ filterIndex(question.question, $index) }} </div>
<div>{{question.question}}</div>

</li>
控制器中的

    var filterValue = 0;

    $scope.filterIndex = function (value, count) {

        if (count === 0) {
            filterValue = 0;
        }

        if (value !== 'statementText') {
            filterValue = filterValue + 1;
            return filterValue;
        }
        else {
            return '"';
        }

    };

即使它没有任何错误,从函数返回的计数没有得到更新,就像我们使用ui-sortable更新订单时使用$ index一样。

在此处查看:js-fiddle using filter function

表示,一旦在&lt; [(4)第四个问题]&gt; 中呈现(4),即使我们将其移至顶部或底部,也将保持相同拖动。

我尝试了不同的方式,几乎所有内容都以&#39;超出最大迭代限制为止。&#39; 。 真实场景有点复杂,因为它包含嵌套的ng-repeats和类似的数字和数字计数,或者在子循环中。

这是开始新鲜的链接: js-fiddle

2 个答案:

答案 0 :(得分:1)

您可以将此注入控制器,它将侦听数组更改并更新索引:

  var update = function(){
      var currentCount = 0;
      var questions = $scope.questions;
      for(var j = 0; j < questions.length; j++){
          if(questions[j].question != null){
              if(questions[j].question.indexOf("statement") < 0){
                  questions[j].calculatedIndex = ++currentCount;
              }
          }
      }
  };

  $scope.$watchCollection('questions', function(){
    update();      
  });

  update();

可能需要稍微微调,因为我没有完全专注于你的问题。在ng-repeat中,您现在可以访问calculatedIndex。对于语句项,它将为“NULL”,您可以使用ng-show。

答案 1 :(得分:0)

尝试添加额外选项:

ng-init='question.index = $index+1'

http://jsfiddle.net/ny279bry/