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.