Использование rowspan для группировки иерархических данных

Можно ли группировать данные (используя rowspan, как описано здесь) в таблице, созданной с помощью угловых символов. Данные иерархичны, а state имеет много counties, и каждый граф имеет несколько zipcodes. Я хочу таблицу с только столбцом для состояния, графства, zip и т.д. (Так что дайте rowpan для длины коллекции). Я не уверен, что ng-repeat-start и ng-repeat-end могут быть использованы для достижения этого. Пожалуйста, ознакомьтесь с шаблоном стартера здесь

 <table>
    <thead>
      <tr>
        <th>State</th>
        <th>County</th>
        <th>Zip</th>
      </tr>
    </thead>
    <tbody>
      <tr ng-repeat='st in states'>
        <td>{{st.name}}</td>
        <td></td>
        <td></td>
      </tr>
    </tbody>
  </table>

данные

 var oh_counties = [
    {name: "Franklin", zips: [111,222,333,444,555]},
    {name: "Adams", zips: [111,222,333,444]},
    {name: "Allen", zips: [111,222,333]}
    ],
    wi_counties = [
    {name: "Dane", zips: [111]},
    {name: "Adams", zips: [111,222,333,444]}
    ]

    $scope.states = [
      {name: "OH", counties: oh_counties},
      {name: "WI", counties: wi_counties},
      ];

Изменить:

Готовая версия желаемого выхода здесь http://plnkr.co/edit/T7toND0odx6qr8mVC121?p=preview

Ответы

Ответ 1

Это вариант ответа Холли Камминса. Повтор перемещается в tr с помощью ng-repeat-start и ng-repeat-end, чтобы предотвратить повторение tbody. Также используется несколько иной метод, чтобы скрыть первую строку.

<tbody>
    <tr ng-repeat-start='st in states'>
      <th rowspan="{{st.counties.length}}">{{st.name}}</th>
      <td>{{st.counties[0].name}}</td>
    </tr>
    <tr ng-repeat-end ng-repeat='county in st.counties' ng-hide="$first">
       <td>{{county.name}}</td>
    </tr>
</tbody>

Ответ 2

Этот вариант ответа KayakDave улучшает структурирование, вытаскивая первую вложенную строку для совместного использования <tr> заголовка:

<tbody ng-repeat='st in states'>
    <tr>
      <th rowspan="{{st.counties.length}}">{{st.name}}</th>
      <td>{{county[0].name}}</td>
    </tr>
    <tr ng-repeat='county in st. counties' ng-show="$index > 0">
       <td>{{county.name}}</td>
    </tr>
</tbody>

Ответ 3

Конечно. Что-то вроде этого, что вы имели в виду:

<tbody ng-repeat='st in states'>
    <td rowspan="{{st.counties.length+1}}">{{st.name}}</td>
    <tr ng-repeat='county in st.counties'>
       <td>{{county.name}}</td>
    </tr>
</tbody>

Я сохранил этот пример простым, вложенным 2 глубоким. Но в скрипке ниже, я получил вложенные 3 глубины (так это включает в себя zip).

демонстрационная скрипка

Ответ 4

Это может быть полезно

<table>
    <tbody ng-repeat='st in states'>
        <tr>
            <th >{{st.name}}</th>
            <td>
                <table>
                    <tr ng-repeat='county in st.counties'>
                        <td>{{county.name}}</td>
                        <td>
                            <table>
                                <tr ng-repeat='zip in county.zips'>
                                    <td>{{zip}}</td>
                                </tr>
                            </table>
                        </td>
                    </tr>
                </table>
            </td>
        </tr>

    </tbody>
</table>