Я ищу правильный шаблон для вставки класса строки начальной загрузки каждые 3 столбца. Мне это нужно, потому что cols не имеет фиксированной высоты (и я не хочу ее исправлять), поэтому это нарушает мой дизайн!
Вот мой код:
<div ng-repeat="product in products">
<div ng-if="$index % 3 == 0" class="row">
<div class="col-sm-4" >
...
</div>
</div>
</div>
Но в каждой строке отображается только один продукт. В качестве конечного результата я хочу:
<div class="row">
<div class="col-sm4"> ... </div>
<div class="col-sm4"> ... </div>
<div class="col-sm4"> ... </div>
</div>
<div class="row">
<div class="col-sm4"> ... </div>
<div class="col-sm4"> ... </div>
<div class="col-sm4"> ... </div>
</div>
Могу ли я добиться этого с помощью только шаблона ng-repeat (без директивы или контроллера)? В документации представлены ng-repeat-start и ng-repeat-end, но я не могу понять, как это использовать, именно в этом случае использования! Я чувствую, что это то, что мы часто используем при создании шаблонов начальной загрузки! ? Спасибо
Ответы:
Ответ, получивший наибольшее количество голосов, хотя и эффективен, это не то, что я считаю подходом angular, и при этом он не использует собственные классы начальной загрузки, которые предназначены для решения этой ситуации. Как упоминалось в @claies,
.clearfix
класс предназначен для таких ситуаций. На мой взгляд, самая чистая реализация выглядит следующим образом:Эта структура позволяет избежать беспорядочной индексации массива продуктов, позволяет использовать чистую точечную нотацию и использовать класс clearfix по прямому назначению.
источник
Я знаю, что уже немного поздно, но все же может кому-то помочь. У меня так получилось:
jsfiddle
источник
ng-if="$index+1 < products.length"
иng-if="$index+2 < products.length"
Хорошо, это решение намного проще, чем уже здесь, и допускает разную ширину столбцов для разной ширины устройства.
Обратите внимание, что
% 6
часть должна равняться количеству результирующих столбцов. Итак, если в элементе столбца у вас есть класс,col-lg-2
будет 6 столбцов, поэтому используйте... % 6
.Этот метод (за исключением
ng-if
) фактически задокументирован здесь: Bootstrap docsисточник
Хотя то, чего вы хотите достичь, может быть полезно, есть еще один вариант, который, я думаю, вы могли упустить из виду, и он намного проще.
Вы правы, таблицы Bootstrap ведут себя странно, когда у вас есть столбцы с нестандартной высотой. Однако существует класс начальной загрузки, созданный для борьбы с этой проблемой и выполнения адаптивного сброса .
просто создайте пустое
<div class="clearfix"></div>
поле перед началом каждой новой строки, чтобы позволить поплавкам сбрасываться, а столбцы возвращаться в свои правильные положения.вот бутплей .
источник
flex
сделать столбцы одинаковой высоты?Спасибо за ваши предложения, вы меня на правильном пути!
Давайте рассмотрим полное объяснение:
По умолчанию HTTP-запрос AngularJS возвращает объект
Итак, если вы хотите использовать функцию @Ariel Array.prototype.chunk, вам нужно сначала преобразовать объект в массив.
А затем использовать функцию chunk В ВАШЕМ КОНТРОЛЛЕРЕ, иначе, если она используется непосредственно в ng-repeat, это приведет вас к ошибке infdig . Итоговый контроллер выглядит:
И HTML становится:
С другой стороны, я решил напрямую вернуть массив [] вместо объекта {} из моего файла JSON. Таким образом, контроллер становится (обратите внимание на специальный синтаксис isArray: true ):
HTML останется таким же, как указано выше.
ОПТИМИЗАЦИЯ
Последний вопрос в ожидании: как сделать его 100% AngularJS без расширения массива javascript с помощью функции chunk ... если некоторые люди хотят показать нам, подходят ли ng-repeat-start и ng-repeat-end .. . Мне любопытно ;)
РЕШЕНИЕ АНДРЕЯ
Благодаря @Andrew мы теперь знаем, что добавление класса очистки начальной загрузки каждые три (или любое другое число) элементов исправляет проблему отображения из-за разной высоты блока.
Итак, HTML становится:
И ваш контроллер остается довольно мягким с удаленной функцией chunck :
источник
Вы можете сделать это без директивы, но я не уверен, что это лучший способ. Для этого вы должны создать массив массива из данных, которые вы хотите отобразить в таблице, и после этого использовать 2 ng-repeat для итерации по массиву.
чтобы создать массив для отображения, используйте эту функцию, например, products.chunk (3)
а затем сделайте что-то подобное, используя 2 ng-repeat
источник
На основе решения Alpar с использованием только шаблонов с anidated ng-repeat. Работает как с полными, так и с частично пустыми строками:
JSFiddle
источник
Я только что решил, что работает только в шаблоне. Решение
Point использует данные дважды, один - для внешнего цикла. Дополнительные теги диапазона останутся, но это зависит от того, как вы торгуете.
Если это трехколоночный макет, он будет похож на
Честно хотел
Хотя не вышло.
источник
Еще одно небольшое улучшение ответа @Duncan и других ответов на основе элемента clearfix. Если вы хотите сделать контент интерактивным, вам понадобится
z-index
> 0, иначе clearfix будет перекрывать контент и обрабатывать щелчок.Этот пример не работает (вы не видите указатель курсора, и щелчок ничего не сделает):
Пока это фиксированный :
Я добавил,
z-index: 1
чтобы контент увеличивался по сравнению с clearfix, и я удалил контейнер div, используя вместо негоng-repeat-start
иng-repeat-end
(доступно в AngularJS 1.2), потому что он не работал z-index.Надеюсь это поможет!
Обновить
Plunker: http://plnkr.co/edit/4w5wZj
источник
flex
строками, чтобы столбцы были одинаковой высоты?я решил это с помощью ng-class
источник
Лучший способ применить класс - использовать ng-class. Его можно использовать для применения классов на основе некоторого условия.
а затем в вашем контроллере
источник
После объединения многих ответов и предложений здесь это мой окончательный ответ, который хорошо работает
flex
, что позволяет нам создавать столбцы с одинаковой высотой, он также проверяет последний индекс, и вам не нужно повторять внутренний HTML. Не используетclearfix
:Результат будет примерно таким:
источник
Небольшая модификация в решении @alpar
jsfiddle
источник
Это сработало для меня, без сращивания или чего-то еще:
HTML
JavaScript
источник
Born Solutions - лучший вариант, просто нужно немного подправить, чтобы удовлетворить потребности, у меня были разные адаптивные решения, и я немного изменился
источник
Основываясь на ответе Alpar, вот более общий способ разбить один список элементов на несколько контейнеров (строки, столбцы, корзины и т. Д.):
для списка из 10 элементов генерирует:
Количество контейнеров можно быстро закодировать в функцию контроллера:
JS (ES6)
HTML
Такой подход позволяет избежать дублирования разметки элемента (
<span>{{item.name}}</span>
в данном случае) в исходном шаблоне - не очень большая победа для простого диапазона, но для более сложной структуры DOM (которая у меня была) это помогает сохранить шаблон DRY.источник
Обновление 2019 - Bootstrap 4
Поскольку в Bootstrap 3 используются числа с плавающей запятой, для предотвращения неравномерного переноса столбцов требуется, чтобы clearfix сбрасывал каждые n (3 или 4) columns (
.col-*
).row
.Теперь, когда Bootstrap 4 использует flexbox , больше нет необходимости переносить столбцы в отдельные
.row
теги или вставлять дополнительные div, чтобы заставить cols переноситься каждые n столбцов.Вы можете просто повторить все столбцы в одном
.row
контейнере.Например, 3 столбца в каждой визуальной строке:
Итак, для Bootstrap ng-repeat просто:
Демо: https://www.codeply.com/go/Z3IjLRsJXX
источник
Я сделал это только с помощью boostrap, вы должны быть очень осторожны в расположении строки и столбца, вот мой пример.
источник