Estoy usando ng-repeat con mi código Tengo 'n' número de cuadro de texto basado en ng-repeat. Quiero alinear el cuadro de texto con tres columnas.
este es mi código
<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>
Respuestas:
El enfoque más confiable y técnicamente correcto es transformar los datos en el controlador. Aquí hay una función y uso simple de fragmentos.
Entonces su vista se vería así:
Si tiene alguna entrada dentro de
ng-repeat
, probablemente querrá desunir / volver a unir las matrices a medida que los datos se modifiquen o se envíen. Así es como se vería en un$watch
, para que los datos siempre estén disponibles en el formato original y combinado:Muchas personas prefieren lograr esto en la vista con un filtro. ¡Esto es posible, pero solo debe usarse con fines de visualización! Si agrega entradas dentro de esta vista filtrada, causará problemas que pueden resolverse, pero que no son bonitos ni confiables .
El problema con este filtro es que devuelve nuevas matrices anidadas cada vez. Angular está mirando el valor de retorno del filtro. La primera vez que se ejecuta el filtro, Angular conoce el valor, luego lo ejecuta nuevamente para asegurarse de que haya terminado de cambiar. Si ambos valores son iguales, el ciclo finaliza. De lo contrario, el filtro se disparará una y otra vez hasta que sean iguales o Angular se dé cuenta de que se está produciendo un bucle de resumen infinito y se apagará. Debido a que Angular no rastreó previamente nuevas matrices / objetos anidados, siempre ve el valor de retorno como diferente al anterior. Para corregir estos filtros "inestables", debe ajustar el filtro en una
memoize
función.lodash
tiene unamemoize
función y la última versión de lodash también incluye unachunk
función, por lo que podemos crear este filtro simplemente usandonpm
módulos y compilando el script conbrowserify
owebpack
.Recuerde: ¡solo visualización! ¡Filtra en el controlador si estás usando entradas!
Instalar lodash:
Crea el filtro:
Y aquí hay una muestra con este filtro:
Ordenar artículos verticalmente
En cuanto a las columnas verticales (lista de arriba a abajo) en lugar de horizontales (de izquierda a derecha), la implementación exacta depende de la semántica deseada. Las listas que se dividen de manera desigual se pueden distribuir de diferentes maneras. Aquí hay una manera:
Sin embargo, la forma más directa y sencilla de obtener columnas es usar columnas CSS :
fuente
a b c
segunda filad e f
. ¿Puedo mostrara b
en la primera columnac d
en la segunda columna ye f
en la tercera columna? Gracias[].concat.call([], val)
. Debes considerar lo queapply
hace.val
es una matriz de matrices, y queremos pasar cada una de esas matrices dentro de ella como argumentos aconcat
. Creo que te estás centrando en el contexto de[]
, que no es el punto aquí. Lo que queremos es[].concat(val[1], val[2], val[3], etc)
, por lo que necesitamosapply([], val)
[]
vs[[]]
y[{}]
. La matriz / objeto anidado hace que Angular vea un resultado diferente en cada unofilter
, y sigue repitiendo buscando que el resultado permanezca igual (estabilizar).var x = [1,2,3]; var y = [1,2,3]; console.log(x === y);
La verificación profunda significa ya sea encadenar y comparar cadenas, lo cual es arriesgado porque un objeto puede no ser encadenable, o verificar recursivamente cada propiedad individualmente. Creo que Angular podría implementar eso para los filtros, pero estoy seguro de que hay buenas razones por las que no lo hicieron. Probablemente porque pretendían principalmente filtros para la modificación simple de un conjunto de datos, no una revisión completa con cambios en la estructura.Esta solución es muy simple:
JSON
HTML:
DEMO en FIDDLE
fuente
ng-switch-when="0"
en un div externo una vez en lugar de los 3 elementos.Una solución limpia y adaptable que no requiere manipulación de datos :
El HTML:
El CSS:
El JavaScript:
Esta es una solución simple para representar datos en filas y columnas dinámicamente sin necesidad de manipular la matriz de datos que está tratando de mostrar. Además, si intenta cambiar el tamaño de la ventana del navegador, puede ver que la cuadrícula se adapta dinámicamente al tamaño de la pantalla / div.
(También agregué un sufijo {{$ index}} a su ID ya que ng-repeat intentará crear múltiples elementos con la misma ID si no lo hace).
Un ejemplo de trabajo similar
fuente
<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>
Eso está dentro de 'modal-body'.La respuesta de m59 es bastante buena. Lo único que no me gusta es que usa
div
s para lo que potencialmente podrían ser datos para una tabla.Entonces, junto con el filtro de m59 (responda en alguna parte arriba), aquí está cómo mostrarlo en una tabla.
fuente
Lo siguiente es una forma más simple:
La respuesta de Cumulo Nimbus es útil para mí, pero quiero que esta cuadrícula esté envuelta por un div que pueda mostrar la barra de desplazamiento cuando la lista es demasiado larga.
Para lograr esto, agregué
style="height:200px; overflow:auto"
un div alrededor de la tabla que hace que se muestre como una sola columna.Ahora funciona para una longitud de matriz de uno.
fuente
ng-hide="$index%2!==0"
Tengo una función y la almacené en un servicio para poder usarla en toda mi aplicación:
Servicio:
});
Controlador:
Margen:
fuente
Mi enfoque fue una mezcla de cosas.
Mi objetivo era tener una cuadrícula que se adaptara al tamaño de la pantalla. Quería 3 columnas para
lg
, 2 columnas parasm
ymd
, y 1 columna paraxs
.Primero, creé la siguiente función de alcance, usando el
$window
servicio angular :Luego, utilicé la clase propuesta por @Cumulo Nimbus:
En el div que contiene el
ng-repeat
, agregué laresizable
directiva, como se explica en esta página , de modo que cada vez que se cambia el tamaño de la ventana, el$window
servicio angular se actualiza con los nuevos valores.Finalmente, en el div repetido tengo:
Por favor, hágame saber cualquier falla en este enfoque.
Espero que pueda ser útil.
fuente
Un simple truco con CSS "clearfix" recomendado por Bootstrap:
Muchas ventajas: eficiente, rápido, utilizando las recomendaciones de Boostrap, evitando posibles problemas de $ digest y sin alterar el modelo angular.
fuente
Este ejemplo produce un repetidor anidado donde los datos externos incluyen una matriz interna que quería enumerar en dos columnas. El concepto sería válido para tres o más columnas.
En la columna interior repito la "fila" hasta que se alcanza el límite. El límite se determina dividiendo la longitud de la matriz de elementos por el número de columnas deseadas, en este caso por dos. El método de división se encuentra en el controlador y se le pasa la longitud de la matriz actual como parámetro. La función de división de JavaScript (0, array.length / columnCount) luego aplicó el límite al repetidor.
Luego se invoca el segundo repetidor de columna y repite el segmento (array.length / columnCount, array.length) que produce la segunda mitad del array en la columna dos.
Espero que esto ayude a ver la solución de otra manera. (PD: esta es mi primera publicación aquí :-))
fuente
Arreglo sin .row
y css
fuente
Aquí hay una manera fácil de hacerlo. Es más manual y termina con un marcado desordenado. No recomiendo esto, pero hay situaciones en las que esto podría ser útil.
Aquí hay un enlace de violín http://jsfiddle.net/m0nk3y/9wcbpydq/
HTML:
JS:
Esta configuración requiere que usemos algunas matemáticas en el marcado: /, por lo que deberá inyectar matemáticas agregando esta línea:
$scope.Math = Math;
fuente
Todas estas respuestas parecen excesivamente diseñadas.
De lejos, el método más simple sería configurar los divs de entrada en una columna de arranque col-md-4, luego la rutina de arranque lo formateará automáticamente en 3 columnas debido a la naturaleza de 12 columnas de la rutina de arranque:
fuente
fuente
Basándome en la muy buena respuesta de m59. Descubrí que las entradas del modelo se verían borrosas si cambiaran, por lo que solo podría cambiar un carácter a la vez. Este es uno nuevo para listas de objetos para cualquier persona que lo necesite:
Y este sería el uso:
fuente
Soy nuevo en bootstrap y angularjs, pero esto también podría hacer Array por 4 elementos como un grupo, el resultado será como 3 columnas. Este truco utiliza el principio de la línea de ruptura bootstrap.
fuente
Lodash tiene un método integrado ahora que yo personalmente uso: https://lodash.com/docs#chunk
En base a esto, el código del controlador podría tener el siguiente aspecto:
Ver código:
fuente
Otra forma se establece
width:33.33%; float:left
en un contenedor wrap div como este:fuente
Me encontré en un caso similar, queriendo generar grupos de visualización de 3 columnas cada uno. Sin embargo, aunque estaba usando bootstrap, estaba tratando de separar estos grupos en diferentes divs principales. También quería hacer algo genéricamente útil.
Lo abordé con 2 de la
ng-repeat
siguiente manera:Esto hace que sea muy fácil cambiar a un número diferente de columnas y separarse en varios divs principales.
fuente
En caso de que alguien quiera un Angular 7 (y una versión superior), aquí hay un ejemplo que utilicé en una de mis aplicaciones:
HTML:
ARCHIVO .TS
Esta es una solución increíble para crear dinámicamente nuevas columnas / filas según la cantidad de elementos que itera desde la base de datos. ¡Gracias!
fuente
Esto responde a la pregunta original que es cómo obtener 1,2,3 en una columna. - preguntado por kuppu 8 de febrero de 14 a 13:47
código angularjs:
Ver código (nota: usando bootstrap 3):
fuente
Este código ayudará a alinear los elementos con tres columnas en modo lg y md, dos columnas en modo sm y una sola columna es modo xs
fuente