Je recherche le bon modèle pour injecter une classe de ligne bootstrap toutes les 3 colonnes. J'en ai besoin parce que les cols n'ont pas de hauteur fixe (et je ne veux pas en corriger une), donc ça casse ma conception!
Voici mon code:
<div ng-repeat="product in products">
<div ng-if="$index % 3 == 0" class="row">
<div class="col-sm-4" >
...
</div>
</div>
</div>
Mais il n'affiche qu'un seul produit dans chaque ligne. Ce que je veux comme résultat final, c'est:
<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>
Puis-je y parvenir avec uniquement un motif ng-repeat (sans directive ni contrôleur)? La documentation présente ng-repeat-start et ng-repeat-end mais je ne peux pas comprendre comment l'utiliser dans ce cas d'utilisation! J'ai l'impression que c'est quelque chose que nous utilisons souvent dans la création de modèles bootstrap! ? Merci
Réponses:
La réponse la plus votée, bien qu'efficace, n'est pas ce que je considérerais comme la voie angulaire, ni n'utilise les propres classes de bootstrap qui sont destinées à faire face à cette situation. Comme @claies l'a mentionné, la
.clearfix
classe est destinée à de telles situations. À mon avis, la mise en œuvre la plus propre est la suivante:Cette structure évite une indexation désordonnée du tableau products, permet une notation par points propre et utilise la classe clearfix pour son usage prévu.
la source
Je sais qu'il est un peu tard, mais cela pourrait encore aider quelqu'un. Je l'ai fait comme ça:
jsfiddle
la source
ng-if="$index+1 < products.length"
etng-if="$index+2 < products.length"
D'accord, cette solution est beaucoup plus simple que celles déjà présentes et permet différentes largeurs de colonne pour différentes largeurs de périphérique.
Notez que la
% 6
pièce est censée être égale au nombre de colonnes résultantes. Donc, si sur l'élément de colonne vous avez la classe,col-lg-2
il y aura 6 colonnes, alors utilisez... % 6
.Cette technique (à l'exclusion du
ng-if
) est en fait documentée ici: Bootstrap docsla source
Bien que ce que vous voulez accomplir puisse être utile, il existe une autre option que vous ignorez peut-être, je crois, qui est beaucoup plus simple.
Vous avez raison, les tables Bootstrap agissent étrangement lorsque vous avez des colonnes qui ne sont pas de hauteur fixe. Cependant, il existe une classe d'amorçage créée pour lutter contre ce problème et effectuer des réinitialisations réactives .
créez simplement un vide
<div class="clearfix"></div>
avant le début de chaque nouvelle ligne pour permettre aux flotteurs de se réinitialiser et aux colonnes de revenir à leurs positions correctes.voici un bootply .
la source
flex
pour que les colonnes aient la même hauteur?Merci pour vos suggestions, vous m'avez mis sur la bonne voie!
Allons-y pour une explication complète:
Par défaut, AngularJS http get query renvoie un objet
Donc, si vous voulez utiliser la fonction @Ariel Array.prototype.chunk, vous devez d'abord transformer l'objet en tableau.
Et puis pour utiliser la fonction chunk DANS VOTRE CONTRÔLEUR sinon si elle est utilisée directement dans ng-repeat, cela vous amènera à une erreur infdig . Le contrôleur final ressemble:
Et le HTML devient:
De l'autre côté, j'ai décidé de retourner directement un tableau [] au lieu d'un objet {} de mon fichier JSON. De cette façon, le contrôleur devient (veuillez noter la syntaxe spécifique isArray: true ):
Le HTML reste le même que ci-dessus.
OPTIMISATION
Dernière question en suspens: comment le rendre 100% AngularJS sans étendre le tableau javascript avec la fonction chunk ... si certaines personnes sont intéressées à nous montrer si ng-repeat-start et ng-repeat-end sont la voie à suivre .. . Je suis curieux ;)
LA SOLUTION D'ANDREW
Grâce à @Andrew, nous savons maintenant que l'ajout d'une classe bootstrap clearfix tous les trois éléments (ou n'importe quel nombre) corrige le problème d'affichage à partir de différentes hauteurs de bloc.
Le HTML devient donc:
Et votre contrôleur reste assez doux avec la fonction chunck supprimée :
la source
Vous pouvez le faire sans directive, mais je ne suis pas sûr que ce soit la meilleure façon. Pour ce faire, vous devez créer un tableau de tableau à partir des données que vous souhaitez afficher dans le tableau, puis utiliser 2 ng-repeat pour parcourir le tableau.
pour créer le tableau à afficher, utilisez cette fonction comme celle-ci products.chunk (3)
puis faites quelque chose comme ça en utilisant 2 ng-repeat
la source
Basé sur la solution Alpar, en utilisant uniquement des modèles avec ng-repeat anidated. Fonctionne avec les lignes pleines et partiellement vides:
JSFiddle
la source
Je viens d'en faire une solution fonctionnant uniquement dans le modèle. La solution est
Le point utilise des données deux fois, un pour une boucle extérieure. Les balises de portée supplémentaire resteront, mais cela dépend de la façon dont vous faites un compromis.
Si c'est une mise en page à 3 colonnes, ça va être comme
Honnêtement je voulais
Bien que cela n'ait pas fonctionné.
la source
Juste une autre petite amélioration concernant la réponse @Duncan et les autres réponses basées sur l'élément clearfix. Si vous souhaitez rendre le contenu cliquable, vous aurez besoin d'un
z-index
> 0 dessus, sinon clearfix chevauchera le contenu et gérera le clic.Cet exemple ne fonctionne pas (vous ne pouvez pas voir le pointeur du curseur et un clic ne fera rien):
Bien que ce soit le fixe :
J'ai ajouté
z-index: 1
pour que le contenu augmente sur le clearfix et j'ai supprimé le conteneur div en utilisant à la placeng-repeat-start
etng-repeat-end
(disponible à partir d'AngularJS 1.2) car cela empêchait z-index de fonctionner.J'espère que cela t'aides!
Mettre à jour
Plunker: http://plnkr.co/edit/4w5wZj
la source
flex
lignes pour que les colonnes aient la même hauteur?J'ai résolu cela en utilisant ng-class
la source
La meilleure façon d'appliquer une classe est d'utiliser ng-class.Il peut être utilisé pour appliquer des classes en fonction de certaines conditions.
puis dans votre contrôleur
la source
Après avoir combiné de nombreuses réponses et suggestions ici, voici ma réponse finale, qui fonctionne bien avec
flex
, qui nous permet de créer des colonnes de hauteur égale, elle vérifie également le dernier index et vous n'avez pas besoin de répéter le HTML interne. Il n'utilise pasclearfix
:Il affichera quelque chose comme ceci:
la source
Petite modification dans la solution de @alpar
jsfiddle
la source
Cela a fonctionné pour moi, aucun épissage ou quoi que ce soit requis:
HTML
JavaScript
la source
Born Solutions, c'est le meilleur, j'ai juste besoin d'un peu de temps pour répondre aux besoins, j'avais différentes solutions réactives et j'ai un peu changé
la source
Sur la base de la réponse d'Alpar, voici un moyen plus généralisé de diviser une seule liste d'éléments en plusieurs conteneurs (lignes, colonnes, seaux, etc.):
pour une liste de 10 éléments, génère:
Le nombre de conteneurs peut être rapidement codé dans une fonction de contrôleur:
JS (ES6)
HTML
Cette approche évite de dupliquer le balisage de l'élément (
<span>{{item.name}}</span>
dans ce cas) dans le modèle source - pas une énorme victoire pour un simple span, mais pour une structure DOM plus complexe (que j'avais), cela aide à garder le modèle DRY.la source
Mise à jour 2019 - Bootstrap 4
Étant donné que Bootstrap 3 utilisait des flottants, il était nécessaire de réinitialiser clearfix toutes les n (3 ou 4) colonnes (
.col-*
) dans le.row
pour éviter un habillage irrégulier des colonnes.Maintenant que Bootstrap 4 utilise flexbox , il n'est plus nécessaire d'envelopper les colonnes dans des
.row
balises séparées , ou d'insérer des div supplémentaires pour forcer les cols à envelopper toutes les n colonnes.Vous pouvez simplement répéter toutes les colonnes en un seul
.row
conteneur.Par exemple, 3 colonnes dans chaque ligne visuelle sont:
Donc, pour Bootstrap, le ng-repeat est simplement:
Démo: https://www.codeply.com/go/Z3IjLRsJXX
la source
Je ne l'ai fait qu'en utilisant boostrap, il faut faire très attention à l'emplacement de la ligne et de la colonne, voici mon exemple.
la source