Подтвердить что ты не робот

Angular.js ng-repeat через несколько tr

Я использую Angular.js для приложения, которое использует скрытые trs для имитации эффекта скольжения, показывая tr и сползая вниз div в td ниже. Этот процесс работал фантастически, используя knockout.js при повторении массива из этих строк, потому что я мог использовать <!-- ko:foreach --> вокруг обоих элементов tr.

С angular, ng-repeat должен быть применен к элементу html, то есть я не могу повторить эти двойные строки, используя стандартные методы. Мой первый ответ на это состоял в том, чтобы создать директиву для представления этих двойных trs, но это не получилось, потому что шаблоны директив должны иметь один корневой элемент, но у меня есть два (<tr></tr><tr></tr>).

Если кто-нибудь, у кого есть опыт работы с ng-repeat и angular, который взломал это, может объяснить, как решить эту проблему, я был бы очень благодарен.

(Я должен также отметить, что привязка ng-repeat к tbody является опцией, но это вызывает несколько tbodys, и я предполагаю, что это плохая форма для стандартного HTML, хотя поправьте меня, если я ошибаюсь)

4b9b3361

Ответ 1

Использование ng-repeat on tbody выглядит корректно, см. этот пост.

Также быстрое тестирование с помощью html validator позволило использовать несколько элементов tbody в одной таблице.

Обновление:. По меньшей мере Angular 1.2 есть ng-repeat-start и ng-repeat-end, чтобы разрешить повторять ряд элементов. Смотрите документацию для получения дополнительной информации и спасибо @Onite за комментарий!

Ответ 2

AngularJS developer @igor-minar ответил на это в Angular.js ng-repeat для нескольких элементов.

Miško Hevery недавно реализовал правильную поддержку через ng-repeat-start и ng-repeat-end. Это усовершенствование не было выпущено с 1.0.7 (стабильное) и 1.1.5 (неустойчивое).

Update

Теперь это доступно в 1.2.0rc1. Ознакомьтесь с официальными документами и этот скринкаст от Джона Линдквиста.

Ответ 3

Наличие нескольких элементов может быть допустимым, но если вы пытаетесь создать прокручиваемую сетку с фиксированными верхними колонтитулами, это может не сработать. Этот код предполагает следующие CSS, jquery и AngularJS.

HTML

<table id="tablegrid_ko">
        <thead>
            <tr>
                <th>
                   Product Title
                </th>
                <th>
                </th>
            </tr>
        </thead>

        <tbody ng-repeat="item in itemList">
            <tr ng-repeat="itemUnit in item.itemUnit">
                <td>{{itemUnit.Name}}</td>
            </tr>
        </tbody>
</table>

CSS для создания фиксированного заголовка/нижнего колонтитула для прокручиваемой таблицы.

#tablegrid_ko {
    max-height: 450px;    
}
#tablegrid_ko
{
border-width: 0 0 1px 1px;
border-spacing: 0;
border-collapse: collapse;
border-style: solid;
}

#tablegrid_ko td, #tablegrid_ko th
{
margin: 0;
padding: 4px;
border-width: 1px 1px 0 0;
border-style: solid;
}


#tablegrid_ko{border-collapse:separate}
#tablegrid_ko tfoot,#tablegrid_ko thead{z-index:1}
#tablegrid_ko tbody{z-index:0}
#tablegrid_ko tr{height:20px}
#tablegrid_ko tr >td,#tablegrid_ko tr >th{
border-width:1px;border-style:outset;height:20px;
max-height:20px;xwidth:45px;xmin-width:45px;xmax-width:45px;white-space:nowrap;overflow:hidden;padding:3px}

#tablegrid_ko tr >th{
background-color:#999;border-color:#2c85b1 #18475f #18475f #2c85b1;color:#fff;font-weight:bold}
#tablegrid_ko tr >td{background-color:#fff}
#tablegrid_ko tr:nth-child(odd)>td{background-color:#f3f3f3;border-color:#fff #e6e6e6 #e6e6e6 #fff}
#tablegrid_ko tr:nth-child(even)>td{background-color:#ddd;border-color:#eaeaea #d0d0d0 #d0d0d0 #eaeaea}

div.scrollable-table-wrapper{
background:#268;border:1px solid #268;
display:inline-block;height:285px;min-height:285px;
max-height:285px;width:550px;position:relative;overflow:hidden;padding:26px 0}

div.scrollable-table-wrapper table{position:static}
div.scrollable-table-wrapper tfoot,div.scrollable-table-wrapper thead{position:absolute}
div.scrollable-table-wrapper thead{left:0;top:0}
div.scrollable-table-wrapper tfoot{left:0;bottom:0}
div.scrollable-table-wrapper tbody{display:block;position:relative;overflow-y:scroll;height:283px;width:550px}

Jquery для привязки горизонтальной прокрутки tbody, это не работает, потому что tbody повторяется во время ng-repeat.

$(function ($) {

$.fn.tablegrid = function () {


        var $table = $(this);
        var $thead = $table.find('thead');
        var $tbody = $table.find('tbody');
        var $tfoot = $table.find('tfoot');

        $table.wrap("<div class='scrollable-table-wrapper'></div>");

        $tbody.bind('scroll', function (ev) {
            var $css = { 'left': -ev.target.scrollLeft };
            $thead.css($css);
            //$tfoot.css($css);
        });


    }; // plugin function



}(jQuery));

Ответ 4

Вы можете сделать это таким образом, как я показал в этом ответе: fooobar.com/info/50187/...

<tr ng-repeat="m in myData">
   <td>{{m.Name}}</td>
   <td>{{m.LastName}}</td>

   <td ng-if="$first" rowspan="{{myData.length}}">
       <ul>
           <li ng-repeat="d in days">
               {{d.hours}}
           </li>
       </ul>
   </td> 
</tr>