2016-03-17 3 views
5

У меня есть рекурсивный массив в JS:AngularJS - Как получить доступ к массиву внутри вложенной нг-повтор

[{ 
    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 
    }] 
}] 

Он отображается в 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. Я также могу получить доступ к $ родителю, но он указывает на корень объекта ...

Как получить доступ к внутренней массив без ручного поиска с помощью всего условий массива рекурсивно? Странно, что вы можете легко получить доступ к индексу внутреннего массива, но не к фактическому экземпляру массива.

И любой совет по этому вопросу? Спасибо ..

EDIT 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, если для контроля видимости в представлении.

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

Да, это очень хороший способ обхода, но мне любопытно, есть ли у вас другие идеи :) –

Смежные вопросы