Мне нужно использовать ng-repeat
(в AngularJS), чтобы перечислить все элементы в массиве.
Сложность состоит в том, что каждый элемент массива преобразуется в одну, две или три строки таблицы.
Я не могу создать действительный HTML, если ng-repeat
используется для элемента, так как между <tbody>
и <tr>
.
Например, если бы я использовал ng-repeat <span>
, я бы получил:
<table>
<tbody>
<span>
<tr>...</tr>
</span>
<span>
<tr>...</tr>
<tr>...</tr>
<tr>...</tr>
</span>
<span>
<tr>...</tr>
<tr>...</tr>
</span>
</tbody>
</table>
Который является недействительным HTML.
Но то, что мне нужно создать:
<table>
<tbody>
<tr>...</tr>
<tr>...</tr>
<tr>...</tr>
<tr>...</tr>
<tr>...</tr>
<tr>...</tr>
</tbody>
</table>
где первая строка была сгенерирована первым элементом массива, следующие три - вторым, а пятый и шестой - последним элементом массива.
Как я могу использовать ng-repeat таким образом, чтобы элемент html, с которым он связан, «исчезал» во время рендеринга?
Или есть другое решение для этого?
Пояснение: сгенерированная структура должна выглядеть следующим образом. Каждый элемент массива может генерировать от 1 до 3 строк таблицы. В идеале ответ должен поддерживать 0-n строк на элемент массива.
<table>
<tbody>
<!-- array element 0 -->
<tr>
<td>One row item</td>
</tr>
<!-- array element 1 -->
<tr>
<td>Three row item</td>
</tr>
<tr>
<td>Some product details</td>
</tr>
<tr>
<td>Customer ratings</td>
</tr>
<!-- array element 2 -->
<tr>
<td>Two row item</td>
</tr>
<tr>
<td>Full description</td>
</tr>
</tbody>
</table>
tr
Насколько я понимаю, если бы я использовал ng-repeat, я бы получил по одной строке на элемент массива.tr
с, которые генерируются одним элементом массива, не имеют одинаковую структуру.Ответы:
Обновление: если вы используете Angular 1.2+, используйте ng-repeat-start . Смотрите ответ @ jmagnusson.
Иначе, как насчет размещения ng-repeat на tbody? (AFAIK, можно иметь несколько <tbody> в одной таблице.)
источник
Начиная с AngularJS 1.2, существует директива,
ng-repeat-start
которая выполняет именно то, что вы просите. Смотрите мой ответ в этом вопросе для описания того, как его использовать.источник
Если вы используете ng> 1.2, вот пример использования
ng-repeat-start/end
без генерации ненужных тегов:Важный момент: для тегов, которые используются
ng-repeat-start
иng-repeat-end
установленыng-if="0"
, чтобы не вставлять на страницу. Таким образом, внутреннее содержимое будет обрабатываться точно так же, как в knockoutjs (с использованием команд in<!--...-->
), и мусора не будет.источник
Возможно, вы захотите сгладить данные в вашем контроллере:
А потом в HTML:
источник
ng-repeat-start
,ng-repeat-end
Сломать мой дизайн, поэтому решение должно было создать дополнительную переменную добавить этот объект разделитель перед каждым элементом и перебирать новый вар:<div class="c477_group"> <div class="c477_group_item" ng-repeat="item in itemsWithSeparator" ng-switch="item.id" ng-class="{'-divider' : item.id == 'SEPARATOR'}"> <div class="c478" ng-switch-when="FAS"/> <div class="c478" ng-switch-when="SEPARATOR" /> <div class="c479" ng-switch-default /> </div> </div>
Вышеприведенное верно, но для более общего ответа этого недостаточно. Мне нужно было вложить ng-repeat, но остаться на том же уровне html, то есть записать элементы в том же родительском элементе. Массив тегов содержит теги, которые также имеют массив тегов. Это на самом деле дерево.
Итак, вот что я в итоге сделал.
Обратите внимание на ng-if = "false", который скрывает начальный и конечный div.
Это должно напечатать
name1, name1_1, name1_2, name2, NAME2_1, name2_2,
источник
Я хотел бы просто прокомментировать, но моей репутации все еще не хватает. Поэтому я добавляю другое решение, которое также решает проблему. Мне бы очень хотелось опровергнуть заявление @bmoeskau о том, что решение этой проблемы требует решения «в лучшем случае взломано», и, поскольку об этом недавно говорилось в дискуссии, хотя этому посту уже 2 года, я хотел бы добавить свой собственные два цента:
Как указал @btford, вы, похоже, пытаетесь превратить рекурсивную структуру в список, поэтому сначала вы должны сгладить эту структуру в списке. Его решение делает это, но есть мнение, что вызов функции внутри шаблона не элегантен. если это правда (если честно, я не знаю), не потребует ли это выполнения функции в контроллере, а не директивы?
в любом случае, ваш html требует список, поэтому область его отображения должна иметь этот список для работы. Вы просто должны сплющить структуру внутри вашего контроллера. как только у вас есть массив $ scope.rows, вы можете сгенерировать таблицу с помощью одного простого ng-repeat. Без взлома, без излишеств, просто так, как это было задумано.
Директивы Angulars не лишены функциональности. Они просто заставляют вас писать действительный HTML. У моего коллеги была похожая проблема, со ссылкой на @bmoeskau в поддержку критики в отношении шаблонов / рендеринга ангуляров. Глядя на точную проблему, выяснилось, что он просто хотел сгенерировать открытый тег, затем закрывающий тег где-нибудь еще и т. Д., Как в старые добрые времена, когда мы объединяли наш html из строк ... верно? нет.
Что касается сглаживания структуры в список, вот еще одно решение:
это будет работать для любой древовидной структуры, имеющей подпункты. Если вам нужен весь элемент вместо свойства, вы можете сократить функцию выравнивания еще больше.
надеюсь, это поможет.
источник
для решения, которое действительно работает
HTML
добавить директиву angular.js
для краткого объяснения,
ng-repeat связывается с
<remove>
элементом и выполняет циклы, как и должно быть, и поскольку мы использовали ng-repeat-start / ng-repeat-end, он циклически повторяет блок html, а не просто элемент.Затем пользовательская директива удаления помещает
<remove>
начальный и конечный элементы<!--removed element-->
источник
Я думаю, что это действительно так :)
источник