2016-03-17 34 views
5

我在JS递归阵列:AngularJS - 如何访问一个嵌套的NG-重复一个数组里面

[{ 
    type: 'cond', 
    conditionId: 1, 
    conditions: undefined 
}, 
{ 
    type: 'cond', 
    conditionId: 2, 
    conditions: undefined 
}, 
{ 
    type: 'group', 
    conditionId: undefined, 
    conditions: [{ 
     type: 'cond', 
     conditionId: 3, 
     conditions: undefined 
    }, 
    { 
     type: 'cond', 
     conditionId: 4, 
     conditions: undefined 
    }] 
}] 

它采用NG-重复递归地与联模板显示在AngularJS:

<script type="text/ng-template" id="recursive_template.html"> 
<div> some logic </div> 
     <div ng-repeat="cond in cond.conditions" ng-include="'recursive_template.html'"></div> 
    <div> some more logic </div> 
</script> 

<div ng-controller="EditRulesController"> 
    <div ng-repeat="cond in conditions" ng-include="'recursive_template.html'" class="row"> 
    </div> 
</div> 

一切工作正常。 现在我想从内部删除一个项目ng-repeat。我可以通过$ index以及对象cond作为参数ng-click来点击(删除)的项目的索引。我还可以访问$父但它指向的对象的根......

如何在没有手动访问内部阵列贯穿整个条件阵列递归搜索?奇怪的是,您可以轻松访问内部数组的索引,但不能访问实际的数组实例。

有关此问题的任何建议?谢谢。

编辑21/03/2016

接受的答案之前,“蛮力”的版本中实现这样的:

 $scope.deleteConditionClick = function (id) { 
      deleteCondition($scope.conditions, id); 
     }; 

     function deleteCondition(conditions, id) { 

      var conds = conditions; 
      if (conds) { 
       for (var i = 0; i < conds.length; i++) { 
        if (conds[i].type === 'cond') { 
         if (conds[i].conditionId === id) { 
          conds.splice(i, 1); 
          return true; 
         } 
        } else if (conds[i].type === 'group') { 

         deleteCondition(conds[i].conditions, id); 
        } 
       } 
      } 
     } 

我希望这会帮助别人有类似的问题。

+0

您无法以cond.conditions.type,cond.conditions.conditionId的身份访问它吗? –

+0

'$ parent。$ parent' - 'ngInclude'正在您的父母重复和您的孩子重复之间创建另一个*范围。 – tymeJV

+0

'$ parent。$ parent'给了我控制器范围,所以数组的根就是了。 –

回答

2

您是否尝试过设置你删除动作要ng-click="cond=undefined"这将清空去​​?。?有条件的。然后,您可以使用ng-show/ng-if来控制视图中的可见性。

0

您可以通过父阵列和对象作为参数(例如:ng-click="delete(conditions, cond)“),并使用.indexOf()功能找对象的指数(例如$scope.delete = function(conditions, cond){index = conditions.indexOf(cond)...}

+1

是的,我试过这个,但它给了我数组的根,因为控制器中有一个'$ scope.conditions'。我也尝试将该变量重命名为与内部数组具有不同名称。不幸的是它不起作用。 –

1

我这是怎么抓住与多个项目指标:

<div ng-repeat="x in outerArray" ng-init="outerIndex = $index"> 
    <div ng-repeat="y in innerArray"> 
    {{ innerArray[outerIndex] }} 
    </div> 
</div> 

我觉得这是你问的是什么,我希望它有助于

+0

谢谢,我喜欢这个。问题是我的对象可以嵌套在任何层次上,而不仅仅是2.在这种情况下,需要一个外部索引列表,这个列表再次难以管理。 –

+0

@michaelbinks的解决方案是否解决了问题,或者我应该提出其他建议吗? –

+0

是的,这是一个非常好的解决方法,但我很好奇,如果你有任何其他的想法:) –