43

テーブルに行を追加する方法を探しています。私のデータ構造は次のようになります。

  rows = [
    { name : 'row1', subrows : [{ name : 'row1.1' }, { name : 'row1.2' }] },
    { name : 'row2' }
  ];

次のようなテーブルを作成したいと思います。

  table
     row1
     row1.1
     row1.2
     row2

それはangularjsng-repeatで可能ですか?そうでない場合、それを行うための「角度のある」方法は何でしょうか?

編集:配列をフラット化することは悪い解決策になります。サブ要素を反復処理できれば、セル内のさまざまなhtmlタグ、他のcssクラスなどを使用できるからです。

4

6 に答える 6

23

ng-repeat ではこれを行うことはできません。ただし、ディレクティブを使用してそれを行うことができます。

<my-table rows='rows'></my-table>

フィドル

myApp.directive('myTable', function () {
    return {
        restrict: 'E',
        link: function (scope, element, attrs) {
            var html = '<table>';
            angular.forEach(scope[attrs.rows], function (row, index) {
                html += '<tr><td>' + row.name + '</td></tr>';
                if ('subrows' in row) {
                    angular.forEach(row.subrows, function (subrow, index) {
                        html += '<tr><td>' + subrow.name + '</td></tr>';
                    });
                }
            });
            html += '</table>';
            element.replaceWith(html)
        }
    }
});
于 2013-03-12T15:10:46.020 に答える
6

はい、可能です:

コントローラ:

app.controller('AppController',
    [
      '$scope',
      function($scope) {
        $scope.rows = [
          { name : 'row1', subrows : [{ name : 'row1.1' }, { name : 'row1.2' }] },
          { name : 'row2' }
        ];

      }
    ]
  );

HTML:

<table>
  <tr ng-repeat="row in rows">
    <td>
      {{row.name}}
      <table ng-show="row.subrows">
        <tr ng-repeat="subrow in row.subrows">
          <td>{{subrow.name}}</td>
        </tr>
      </table>
    </td>
  </tr>
</table>

プランカー

サブテーブルが必要ない場合は、行を平坦化します (サブ行に注釈を付けて、区別できるようにします)。

コントローラ:

function($scope) {
  $scope.rows = [
    { name : 'row1', subrows : [{ name : 'row1.1' }, { name : 'row1.2' }] },
    { name : 'row2' }
  ];

  $scope.flatten = [];
  var subrows;
  $scope.$watch('rows', function(rows){
    var flatten = [];
    angular.forEach(rows, function(row){
      subrows = row.subrows;
      delete row.subrows;
      flatten.push(row);
      if(subrows){
        angular.forEach(subrows, function(subrow){
          flatten.push( angular.extend(subrow, {subrow: true}) );
        });
      }
    });
    $scope.flatten = flatten;
  });

}

HTML:

<table>
  <tr ng-repeat="row in flatten">
    <td>
      {{row.name}}
    </td>
  </tr>
</table>

プランカー

于 2013-03-12T13:49:12.193 に答える
0

ここに例があります。peopeByCityこのコードは、配列内のすべての人のすべての名前を出力します。

TS:

export class AppComponent {
  peopleByCity = [
    {
      city: 'Miami',
      people: [
        {
          name: 'John', age: 12
        }, {
          name: 'Angel', age: 22
        }
      ]
    }, {
      city: 'Sao Paulo',
      people: [
        {
          name: 'Anderson', age: 35
        }, {
          name: 'Felipe', age: 36
        }
      ]
    }
  ]
}

HTML:

<div *ngFor="let personsByCity of peopleByCity">
  <div *ngFor="let person of personsByCity.people">
    {{ person.name }}
  </div>
</div>
于 2017-04-14T18:43:59.330 に答える