Estoy buscando el patrón correcto para inyectar una clase de fila de arranque cada 3 columnas. Necesito esto porque cols no tiene una altura fija (y no quiero arreglar una), ¡así que rompe mi diseño!
Aquí está mi código:
<div ng-repeat="product in products">
<div ng-if="$index % 3 == 0" class="row">
<div class="col-sm-4" >
...
</div>
</div>
</div>
Pero solo muestra un producto en cada fila. Lo que quiero como resultado final es:
<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>
¿Puedo lograr esto con solo el patrón ng-repeat (sin directiva o controlador)? Los documentos introducen ng-repeat-start y ng-repeat-end, ¡pero no puedo entender cómo usarlo en este caso de uso! ¡Siento que esto es algo que usamos a menudo en las plantillas de arranque! ? Gracias
Respuestas:
La respuesta más votada, aunque efectiva, no es lo que yo consideraría la forma angular, ni está utilizando las propias clases de bootstrap que están destinadas a lidiar con esta situación. Como mencionó @claies, la
.clearfix
clase está destinada a situaciones como estas. En mi opinión, la implementación más limpia es la siguiente:Esta estructura evita la indexación desordenada de la matriz de productos, permite una notación de puntos limpia y hace uso de la clase clearfix para el propósito previsto.
fuente
Sé que es un poco tarde, pero aún podría ayudar a alguien. Lo hice así:
jsfiddle
fuente
ng-if="$index+1 < products.length"
yng-if="$index+2 < products.length"
De acuerdo, esta solución es mucho más simple que las que ya están aquí y permite diferentes anchos de columna para diferentes anchos de dispositivo.
Tenga en cuenta que
% 6
se supone que la parte es igual al número de columnas resultantes. Entonces, si en el elemento de columna tiene la clasecol-lg-2
, habrá 6 columnas, así que use... % 6
.Esta técnica (excluyendo la
ng-if
) está realmente documentada aquí: Bootstrap docsfuente
Si bien lo que desea lograr puede ser útil, hay otra opción que creo que podría estar pasando por alto y que es mucho más simple.
Tiene razón, las tablas Bootstrap actúan de manera extraña cuando tiene columnas que no tienen una altura fija. Sin embargo, existe una clase de arranque creada para combatir este problema y realizar reinicios sensibles .
simplemente cree un vacío
<div class="clearfix"></div>
antes del inicio de cada nueva fila para permitir que los flotadores se reinicien y las columnas vuelvan a sus posiciones correctas.aquí hay un bootply .
fuente
flex
para que las columnas tengan la misma altura?Gracias por tus sugerencias, ¡me pusiste en el camino correcto!
Vayamos por una explicación completa:
Por defecto AngularJS http get query devuelve un objeto
Entonces, si desea utilizar la función @Ariel Array.prototype.chunk, primero debe transformar el objeto en una matriz.
Y luego usar la función chunk EN SU CONTROLADOR; de lo contrario, si se usa directamente en ng-repeat, obtendrá un error de infdig . El controlador final se ve:
Y HTML se convierte en:
Por otro lado, decidí devolver directamente una matriz [] en lugar de un objeto {} de mi archivo JSON. De esta manera, el controlador se convierte (tenga en cuenta la sintaxis específica isArray: true ):
HTML sigue siendo el mismo que el anterior.
MEJORAMIENTO
La última pregunta en suspenso es: cómo hacerlo 100% AngularJS sin extender la matriz de javascript con la función chunk ... si algunas personas están interesadas en mostrarnos si ng-repeat-start y ng-repeat-end son el camino a seguir ... . Soy curioso ;)
LA SOLUCIÓN DE ANDREW
Gracias a @Andrew, ahora sabemos que agregar una clase de arranque clearfix cada tres (o cualquier número) elemento corrige el problema de visualización desde diferentes alturas de bloque.
Entonces HTML se convierte en:
Y su controlador se mantiene bastante suave con la función de chunck eliminada :
fuente
Puede hacerlo sin una directiva, pero no estoy seguro de que sea la mejor manera. Para hacer esto, debe crear una matriz de matriz a partir de los datos que desea mostrar en la tabla, y luego use 2 ng-repeat para iterar a través de la matriz.
para crear la matriz para la visualización, use esta función como esa products.chunk (3)
y luego haz algo así usando 2 ng-repeat
fuente
Basado en la solución de Alpar, utilizando solo plantillas con repetición ng anidada. Funciona con filas llenas y parcialmente vacías:
JSFiddle
fuente
Acabo de hacer una solución que funciona solo en plantilla. La solucion es
El punto está usando datos dos veces, uno es para un bucle externo. Las etiquetas de tramo adicionales permanecerán, pero depende de cómo las intercambie.
Si es un diseño de 3 columnas, será como
Honestamente yo quería
Aunque no funcionó.
fuente
Solo otra pequeña mejora sobre la respuesta de @Duncan y las otras respuestas basadas en el elemento clearfix. Si desea que se pueda hacer clic en el contenido , necesitará un
z-index
> 0 o clearfix superpondrá el contenido y manejará el clic.Este es el ejemplo que no funciona (no puede ver el puntero del cursor y hacer clic no hará nada):
Si bien este es el fijo :
He añadido
z-index: 1
a tener el aumento de contenido a través de clearfix y he quitado el contenedor div utilizando en su lugarng-repeat-start
yng-repeat-end
(disponible en AngularJS 1.2) porque hizo z-index no funciona.¡Espero que esto ayude!
Actualizar
Plunker: http://plnkr.co/edit/4w5wZj
fuente
flex
en filas para que las columnas tengan la misma altura?Resolví esto usando ng-class
fuente
La mejor manera de aplicar una clase es usar ng-class, que se puede usar para aplicar clases en función de alguna condición.
y luego en tu controlador
fuente
Después de combinar muchas respuestas y sugerencias aquí, esta es mi respuesta final, que funciona bien con
flex
, que nos permite hacer columnas con la misma altura, también verifica el último índice y no es necesario repetir el HTML interno. No usaclearfix
:Producirá algo como esto:
fuente
Pequeña modificación en la solución de @alpar
jsfiddle
fuente
Esto funcionó para mí, sin empalmes ni nada requerido:
HTML
JavaScript
fuente
Born Solutions es la mejor, solo necesito un poco de ajuste para satisfacer las necesidades, tuve diferentes soluciones de respuesta y cambié un poco
fuente
Sobre la base de la respuesta de Alpar, aquí hay una forma más generalizada de dividir una sola lista de elementos en varios contenedores (filas, columnas, cubos, lo que sea):
para una lista de 10 elementos, genera:
El número de contenedores se puede codificar rápidamente en una función de controlador:
JS (ES6)
HTML
Este enfoque evita duplicar el marcado del elemento (
<span>{{item.name}}</span>
en este caso) en la plantilla de origen; no es una gran victoria para un tramo simple, pero para una estructura DOM más compleja (que tenía) esto ayuda a mantener la plantilla SECA.fuente
Actualización 2019 - Bootstrap 4
Dado que Bootstrap 3 usaba flotantes, requería reiniciar clearfix cada n (3 o 4) columnas (
.col-*
) en el.row
para evitar un ajuste desigual de las columnas.Ahora que Bootstrap 4 usa flexbox , ya no es necesario envolver columnas en
.row
etiquetas separadas , o insertar divs adicionales para forzar a cols a envolver cada n columnas.Simplemente puede repetir todas las columnas en un solo
.row
contenedor.Por ejemplo, 3 columnas en cada fila visual es:
Entonces, para Bootstrap, ng-repeat es simplemente:
Demostración: https://www.codeply.com/go/Z3IjLRsJXX
fuente
Lo hice solo usando boostrap, debes tener mucho cuidado en la ubicación de la fila y la columna, aquí está mi ejemplo.
fuente