Я использую ng-repeat со своим кодом. У меня есть n-е текстовое поле на основе ng-repeat. Я хочу выровнять текстовое поле с тремя столбцами.
это мой код
<div class="control-group" ng-repeat="oneExt in configAddr.ext">
{{$index+1}}.
<input type="text" name="macAdr{{$index+1}}"
id="macAddress" ng-model="oneExt.newValue" value=""/>
</div>
Ответы:
Самый надежный и технически правильный подход - преобразовать данные в контроллере. Вот простая функция и использование фрагментов.
Тогда ваше представление будет выглядеть так:
Если у вас есть какие-либо входные данные в
ng-repeat
, вы, вероятно, захотите разделить / повторно объединить массивы по мере изменения данных или при отправке. Вот как это будет выглядеть в a$watch
, чтобы данные всегда были доступны в исходном объединенном формате:Многие люди предпочитают делать это в представлении с фильтром. Это возможно, но должно использоваться только для демонстрации! Если вы добавите входные данные в это отфильтрованное представление, это вызовет проблемы, которые можно решить, но они не будут красивыми или надежными .
Проблема с этим фильтром в том, что он каждый раз возвращает новые вложенные массивы. Angular наблюдает за возвращаемым значением из фильтра. При первом запуске фильтра Angular знает значение, а затем запускает его снова, чтобы убедиться, что оно изменилось. Если оба значения совпадают, цикл завершается. В противном случае фильтр будет срабатывать снова и снова, пока они не станут одинаковыми, или Angular не поймет, что происходит бесконечный цикл дайджеста, и отключится. Поскольку новые вложенные массивы / объекты ранее не отслеживались Angular, он всегда видит возвращаемое значение как отличное от предыдущего. Чтобы исправить эти «нестабильные» фильтры, вы должны заключить фильтр в
memoize
функцию.lodash
имеетmemoize
функцию, и последняя версия lodash также включаетchunk
функцию, поэтому мы можем создать этот фильтр очень просто, используяnpm
modules и компилируем скрипт с помощьюbrowserify
илиwebpack
.Помните: только отображение! Отфильтруйте контроллер, если вы используете входы!
Установите lodash:
Создайте фильтр:
А вот образец с этим фильтром:
Заказывайте товары по вертикали
Что касается вертикальных столбцов (список сверху вниз), а не горизонтальных (слева направо), точная реализация зависит от желаемой семантики. Списки, которые делятся неравномерно, можно распределить по-разному. Вот один из способов:
Однако наиболее прямой и простой способ получить столбцы - использовать столбцы CSS :
источник
a b c
второй строкиd e f
. Могу ли я отображатьa b
в первом столбцеc d
во втором столбце иe f
в третьем столбце? Спасибо[].concat.call([], val)
. Вы должны учитывать, чтоapply
делает.val
- это массив массивов, и мы хотим передать каждый из этих массивов внутри него в качестве аргументовconcat
. Я думаю, вы фокусируетесь на контексте[]
, но не в этом суть. Мы хотим[].concat(val[1], val[2], val[3], etc)
, значит, нам и нужноapply([], val)
[]
vs[[]]
и[{}]
. Вложенный массив / объект заставляет Angular видеть разные результаты на каждомfilter
и продолжает повторять поиск того же результата (стабилизации).var x = [1,2,3]; var y = [1,2,3]; console.log(x === y);
Глубокая проверка означает либо преобразование в строку и сравнение строк, что рискованно, поскольку объект не может быть преобразован в строку, либо рекурсивную проверку каждого свойства по отдельности. Я думаю, что Angular может реализовать это для фильтров, но я уверен, что на то есть веская причина. Вероятно потому, что они в основном предназначались для фильтров для простой модификации набора данных, а не для полного пересмотра с изменениями в структуре.Это решение очень простое:
JSON:
HTML:
ДЕМО в FIDDLE
источник
ng-switch-when="0"
во внешнем div один раз, а не на всех трех элементах.Чистое, адаптируемое решение, не требующее манипулирования данными :
HTML:
CSS:
JavaScript:
Это простое решение для динамического рендеринга данных в строки и столбцы без необходимости манипулировать массивом данных, которые вы пытаетесь отобразить. Кроме того, если вы попытаетесь изменить размер окна браузера, вы увидите, что сетка динамически адаптируется к размеру экрана / div.
(Я также добавил суффикс {{$ index}} к вашему идентификатору, поскольку ng-repeat попытается создать несколько элементов с одним и тем же идентификатором, если вы этого не сделаете.)
Аналогичный рабочий пример
источник
<span ng-repeat="z in waiverModalLinks" ng-class="{'new-row':startNewRow($index, columnBreak)}" class="{{z.id}}"><a href="{{z.link}}{{z.title}}">{{z.title}}</a></span>
Это внутри `модального тела '.Ответ m59 довольно хорош. Единственное, что мне не нравится в нем, так это то, что он использует
div
s для того, что потенциально может быть данными для таблицы.Итак, в сочетании с фильтром m59 (ответ где-то выше), вот как отобразить его в таблице.
источник
Ниже приводится более простой способ:
Ответ Cumulo Nimbus полезен для меня, но я хочу, чтобы эта сетка была обернута div, который может отображать полосу прокрутки, когда список слишком длинный.
Чтобы добиться этого, я добавил
style="height:200px; overflow:auto"
к таблице div, который отображает его как отдельный столбец.Теперь работает для массива длиной один.
источник
ng-hide="$index%2!==0"
У меня есть функция, и я сохранил ее в службе, чтобы использовать ее во всем приложении:
Обслуживание:
});
контроллер:
Разметка:
источник
Мой подход был смесью вещей.
Моей целью было адаптировать сетку к размеру экрана. Я хотел 3 столбца для
lg
, 2 столбца дляsm
иmd
и 1 столбец дляxs
.Сначала я создал следующую функцию области видимости, используя
$window
службу angular :Затем я использовал класс, предложенный @Cumulo Nimbus:
В div, содержащий объект
ng-repeat
, я добавилresizable
директиву, как описано на этой странице , чтобы каждый раз при изменении размера окна$window
служба angular обновлялась новыми значениями.В конечном итоге в повторяющемся div у меня есть:
Пожалуйста, сообщите мне о недостатках этого подхода.
Надеюсь, это может быть полезно.
источник
Простой трюк с CSS clearfix, рекомендованный Bootstrap:
Множество преимуществ: эффективность, скорость, использование рекомендаций Boostrap, предотвращение возможных проблем с дайджестом и отсутствие изменения модели Angular.
источник
В этом примере создается вложенный повторитель, внешние данные которого включают внутренний массив, который я хотел перечислить в двух столбцах. Эта концепция будет верна для трех или более столбцов.
Во внутреннем столбце повторяю «ряд» до тех пор, пока не будет достигнут предел. Предел определяется путем деления длины массива элементов на количество желаемых столбцов, в данном случае на два. Метод деления находится на контроллере, и ему передается текущая длина массива в качестве параметра. Затем функция JavaScript slice (0, array.length / columnCount) применила ограничение к повторителю.
Затем вызывается второй повторитель столбца, который повторяет срез (array.length / columnCount, array.length), который создает вторую половину массива во втором столбце.
Надеюсь, это поможет взглянуть на решение еще с одной стороны. (PS это мой первый пост здесь! :-))
источник
Исправляю без .row
и css
источник
Вот простой способ сделать это. Это больше ручное и заканчивается грязной разметкой. Я не рекомендую это делать, но в некоторых ситуациях это может быть полезно.
Вот ссылка на скрипку http://jsfiddle.net/m0nk3y/9wcbpydq/
HTML:
JS:
Эта установка требует, чтобы мы использовали математику в разметке: /, поэтому вам нужно ввести Math, добавив эту строку:
$scope.Math = Math;
источник
Все эти ответы кажутся чрезмерно продуманными.
Безусловно, самым простым методом было бы настроить входные блоки div в бутстрапе столбца col-md-4, тогда бутстрап автоматически отформатирует его в 3 столбца из-за 12-столбцового характера начальной загрузки:
источник
источник
Основываясь на очень хорошем ответе m59. Я обнаружил, что входные данные модели будут размыты, если они изменятся, поэтому вы можете изменять только один символ за раз. Это новый список объектов для всех, кому он нужен:
И это будет использование:
источник
Я новичок в bootstrap и angularjs, но это также может сделать массив на 4 элемента как одну группу, результат будет почти как 3 столбца. Этот трюк использует принцип разрыва начальной загрузки.
источник
Lodash теперь имеет встроенный метод фрагментов, который я использую лично: https://lodash.com/docs#chunk
Исходя из этого, код контроллера может выглядеть следующим образом:
Посмотреть код:
источник
Другой способ - установить
width:33.33%; float:left
div-обертку следующим образом:источник
Я оказался в аналогичном случае, когда хотел создать группы отображения по 3 столбца в каждой. Однако, хотя я использовал бутстрап, я пытался разделить эти группы на разные родительские div. Еще я хотел сделать что-то общее.
Я подошел к нему с 2,
ng-repeat
как показано ниже:Это позволяет очень легко перейти на другое количество столбцов и разделить их на несколько родительских div.
источник
На всякий случай, если кому-то понадобится Angular 7 (и более поздняя версия), вот пример, который я использовал в одном из своих приложений:
HTML:
.TS ФАЙЛ
Это отличное решение для динамического создания новых столбцов / строк в зависимости от того, сколько элементов вы повторяете из базы данных. Спасибо!
источник
это отвечает на исходный вопрос: как получить 1,2,3 в столбце. - задан kuppu 08 фев.
angularjs код:
Просмотреть код (примечание: с использованием bootstrap 3):
источник
Этот код поможет выровнять элементы с тремя столбцами в режиме lg и md, двумя столбцами в режиме sm и одним столбцом в режиме xs
источник