2016-03-17 17 views
5

Mam rekurencyjną tablicę w JS:angularjs - Jak uzyskać dostęp do tablicy wewnątrz zagnieżdżonej NG-repeat

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

jest on wyświetlany w angularjs użyciu NG-repeat rekurencyjnie z szablonem inline:

<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> 

Wszystko działa poprawnie. Teraz chcę usunąć jeden element z wewnętrznej ng-repeat. Mogę uzyskać indeks elementu, który klikam (do usunięcia) z $ indeks, również obiekt cond jako parametr na ng-click. Mogę również dostęp $ rodzica ale wskazuje na korzeń przedmiotu ...

Jak uzyskać dostęp do wewnętrznej tablicy bez konieczności ręcznego przeszukiwania całej warunkach tablica rekurencyjnie? Dziwne, że można łatwo uzyskać dostęp do indeksu wewnętrznej tablicy, ale nie rzeczywistej instancji tablicy.

A jakakolwiek rada w tej sprawie? Dziękuję ..

EDIT 21/03/2016

Przed zaakceptowanej odpowiedzi, 'brute-force' wersja jest realizowany tak:

 $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); 
        } 
       } 
      } 
     } 

Mam nadzieję, że to pomoże innym z podobnym problemem.

+0

Nie masz dostępu do niego jako cond.conditions.type, cond.conditions.conditionId? –

+0

'$ parent. $ Parent' -' ngInclude' tworzy * inny * zakres pomiędzy powtórzeniem twojego rodzica a powtórzeniem twojego dziecka. – tymeJV

+0

'$ parent. $ Parent' dał mi zasięg kontrolera, a więc ponownie root bazy. –

Odpowiedz

2

Czy próbowano ustawienie usunąć skargę za ng-click="cond=undefined" to opróżnić DE?.? stan pożądany. Następnie można użyć polecenia ng-show/ng-if, aby kontrolować widoczność w widoku.

0

Można przekazać tablicę dominującą i obiekt jako parametrów (np .: ng-click="delete(conditions, cond) „) i użyć .indexOf() funkcji znaleźć indeks obiektu (np. $scope.delete = function(conditions, cond){index = conditions.indexOf(cond)...})

+1

Tak, próbowałem tego, ale daje mi root tablicy, ponieważ w kontroler znajduje się '$ scope.conditions'. Próbowałem również zmienić nazwę tej zmiennej, aby mieć inną nazwę z wewnętrznych tablic. Niestety to nie działa. –

1

To jest jak łapię przedmiotów z wieloma indeksy:

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

myślę, że to, co pan pyta mam nadzieję, że to pomaga

+0

Dziękuję, podoba mi się to. Problem polega na tym, że mój obiekt może być zagnieżdżony na dowolnym poziomie, a nie tylko 2. W takim przypadku potrzebna jest lista zewnętrznych indeksów, co znowu jest trudne do zarządzania. –

+0

Czy rozwiązanie @michaelbinks rozwiązało problem, czy powinienem zaproponować coś innego? –

+0

Tak, jest to bardzo dobre rozwiązanie, ale jestem ciekawy, czy masz jakieś inne pomysły :) –

Powiązane problemy