Angular.js ng-повторення через декілька tr


125

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

З кутовим, ng-repeatслід застосувати до елемента html, тобто я не можу повторити ці подвійні рядки за допомогою стандартних методів. Моя перша відповідь на це полягала в тому, щоб створити директиву для представлення цих подвійних параметрів, але це виявилося невдалим, оскільки шаблони директив повинні мати один кореневий елемент, але у мене є два ( <tr></tr><tr></tr>).

Якщо хтось із досвідом роботи з ng-повтором та кутом, який зламав це, може пояснити, як вирішити цю проблему, я б дуже вдячний.

(Я також повинен зазначити, що приєднання ng-repeatдо tbody є варіантом, але це створює кілька tbodys, і я припускаю, що це погана форма для стандартного HTML, хоча виправте мене, якщо я помиляюся)

Відповіді:


169

Використання ng-repeatпо - tbodyмабуть, діє см цей пост .

Також швидкий тест через валідатор html дозволив tbodyв одній таблиці кілька елементів.

Оновлення: Щонайменше з кутовим 1,2 є ng-repeat-startі, ng-repeat-endщоб дозволити повторення серії елементів. Дивіться документацію для отримання додаткової інформації та дякую @Onite за коментар!


Фантастичний. У мене була така ж проблема, і я насправді обговорював це, але я думав, що це ніколи не вийде просто ітерацією на тег tbody. Дякую!
ХалилРаванна

12
Це трохи після факту зараз, але Angular 1.2 ввів директиви ng-повтор-запуск та ng-повторення-кінця, щоб дозволити ітерацію над декількома елементами.
Цілком

1
@Onite Це набагато пізніше, і я використовую AS 1.5, але не знав про додані -end та -start функціональності ng-повтору. Ви вказали мені туди, тому ніколи не вибачтесь за додавання інформації у відповідь.
Невіл

1
URL-адреса документації для повторення є неправильною, але зміна не більше шести символів, тому я не можу редагувати її, не додавши лише непотрібну мета- редакцію
Білл Роулінсон

35

AngularJS-розробник @ igor-minar відповів на це у Angular.js ng-повторенні через декілька елементів .

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

Оновлення

Зараз це доступно в 1.2.0rc1. Ознайомтеся з офіційними документами та цим екраністом Джона Ліндквіста.


Він згадує про це у прямому ефірі зустрічі Angular з 11 червня 2013 року. З нетерпінням чекаючи цієї та інших особливостей у програмі Angular 1.1.5+ та Angular 2.0.
thegreenpizza

Я вказую на 1.1.5 на cdnjs cdn, і це не працює. //cdnjs.cloudflare.com/ajax/libs/angular.js/1.1.5/angular.min.js чи знаєте ви, у якій версії ця версія має бути доступна?
Shanimal

Правильно, не було випущено станом на 1.1.5, тому дивіться 1.1.6 (або дуже ймовірно 1.2.0), щоб незабаром приземлитися. Ось зобов’язання Мішко слідкувати за випуском: github.com/angular/angular.js/commit/…
Anson

Також добре помітити, що це працює для кожної директиви, не тільки ngRepeat;)
7hi4g0

4

Наявність декількох елементів може бути дійсним, але якщо ви намагаєтеся створити прокручувану сітку з фіксованим заголовком / колонтитулами, наступне може не працювати. Цей код передбачає наступні 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-повтору.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.