2013-07-09 17 views
5

Pracuję nad aplikacją AngularJS, która tworzy arkusz kalkulacyjny z tablicy 2D zbudowanej przez funkcję ng-repeat. Obecnie piszę funkcję, która zmieni początkowe wartości tablicy, gdy użytkownik wprowadzi nowe wartości w arkuszu kalkulacyjnym. To wymaga ode mnie dostępu do punktu w początkowej tablicy na podstawie indeksu wiersza i indeksu kolumny, więc mogę zmienić ją na nową wartość.

Zerknąłem na ng-repeat API i odkryłem, że ma on właściwość $index, która pozwala mi sprawdzić indeks bieżącej powtarzanej wartości. Jednak jestem stwierdzenia, że ​​to będzie tylko niech mi sprawdzić indeks wartości cokolwiek powtarzać pętla jesteś w środku. - żadne inne pętle poza tym może pojawić się również w

<script> 

    data = [ 
      [A1, B1, C1], 
      [A2, B2, C2], 
      [A3, B3, C3] 
      ] 

    sheet= function($scope, $parse){ 
    $scope.columns = [colA, colB, colC]; 
    $scope.rows = data.length; 
    $scope.cells = {}; 
    $scope.outer = data.map(function(c,row){ 
     return c.map(function(data, ind){ 
      return { 
       content: data, 
       model: null, 
      }; 
     }); 
    }); 
    }; 
</script> 


<div ng-app ng-controller="sheet"> 
    <table> 
     <tr class="column-label"> 
      <td ng-repeat="column in columns">{{column}}</td> 
     <tr ng-repeat="inner in outer"> 
      <td class="row-label" ng-repeat="data in inner"> 
       <div> 
        <input type="text" ng-model="data.content" value="{{data.content}}"> 
       </div> 
      </td> 
     </tr> 
    </table> 
</div> 

Chcę otworzyć $index z outer w pętli inner, a także mieć dostęp do $index z inner. Czy jest jakiś sposób na zrobienie tego? Mam zamiar przekazać te wartości jako parametry do funkcji, którą piszę.

+0

Może jest bardziej prosta odpowiedź, ale ja byłbym w stanie tak po prostu s tart sprawdzanie ng-repeat, być może możesz po prostu napisać własną dyrektywę, która specjalnie obsługuje tę sprawę dla ciebie. Dobre pytanie. – shaunhusain

+2

'$ parent. $ Index' lub może' $ parent(). $ Index' - Jedna z tych dwóch powinna działać. – rGil

+0

'$ rodzic. $ Indeks' działa. Dzięki! – user2494584

Odpowiedz

10

Haha, dobrze, odpowiedział w komentarzach, a ja łącząc moje skrzypce, ale tutaj jest to demonstracja niej dla ludzi ze znalezieniem na to pytanie w dół drogi:

http://jsfiddle.net/V8qzt/1/

<div ng-controller="MyCtrl"> 
    <table> 
     <tr ng-repeat="row in data"> 
     <td ng-repeat="cell in row"> 
      {{cell}} ({{$index}},{{$parent.$index}}) 
      </td> 
     </tr> 
    </table> 
</div> 
+0

Otrzymuję "Duplikaty w repeterze są niedozwolone" –

+1

rozwiązano, dodając "track by $ index" (http://stackoverflow.com/questions/16296670/angular-ng-repeat-error-duplicates-in- a-repeater-are-not-allowed) –

0

Tutaj to jest mój kod, może to ci pomoże lub kogoś, kto znajdzie sposób na zapętlenie tablicy 2D na dwa elementy powtarzające ng. HTML kod

kod
<div ng-repeat="row in gameMatrix track by $index"> 
    <div id=cell_{{row.id}}> 
    </div> 
</div> 

Javascript:

$scope.gameData = [ 
    [1, 0, 0], 
    [1, 0, 0], 
    [1, 0, 0], 
    [1, 0, 0] 
]; 

$scope.presentCellsData = function() { 
    var Str = ""; 
    var rows = []; 
    var term = []; 
    for (i = 0; i < $scope.gameData.length; i++) { 
     Str = ""; 
     rows = ""; 
     for (j = 0; j < $scope.gameData[i].length; j++) { 
      console.log("i j " + i + " " + j); 
      console.log($scope.gameData[i][j]); 
      Str = "<div style='display:inline-block'> " + $scope.gameData[i][j] + "&nbsp;</div>"; 
      rows += Str; 
     } 
     rows += "</br>"; 
     term.push({ "id": i, "data": rows }); 
    } 
    console.log(term); 
    return term; 
} 

$scope.gameMatrix = $scope.presentCellsData(); 
angular.element(document).ready(function() { 
    for (i = 0; i < $scope.gameMatrix.length; i++) { 
     console.log("$scope.gameMatrix[i]"); 
     console.log($scope.gameMatrix[i]); 
     document.getElementById("cell_" + i).outerHTML = $scope.gameMatrix[i].data; 
    } 
}); 

@Karen: Dzięki Ci, mogę przy użyciu kodu w ten sposób z moimi danymi:

<div style="display: inline-block;" ng-repeat="row in gameData track by $index"> 
     <!-- <div id=cell_{{row.id}}> 
      aaa 
     </div> --> 
     <div ng-repeat="cell in row track by $index"> 
      {{cell}} 
     </div> 
    </div>