Angulaire ng-repeat ajouter bootstrap ligne tous les 3 ou 4 cols
Je suis à la recherche pour le bon modèle pour injecter un bootstrap ligne de classe chaque 3 colonnes. J'ai besoin de ce parce que les cols n'ont pas fixé de hauteur (et je ne veux pas fixer un), ça me brise le design !
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 ne fait qu'afficher un produit dans chaque ligne. Ce que je veux comme résultat final 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 réaliser cela avec seulement ng-repeat modèle (sans directive ou contrôleur) ? Le docs introduire ng-repeat, lancez-ng-repeat-end, mais je ne peux pas comprendre comment utiliser, il est ce cas d'utilisation ! J'ai l'impression que c'est quelque chose que nous utilisons souvent dans le bootstrap de template ! ? Grâce
- Je pense que vous devriez modèle de données d'une manière qui correspond à votre conception, il devrait probablement être multidimensionnelle tableau ou d'un objet, avec la représentation de lignes et de colonnes, alors vous devriez effectuer une itération sur les lignes et l'utilisation conditionnelle de classe "ng-classe" directive et à l'intérieur de la ligne vous devez ensuite effectuer une itération sur les colonnes.
- Intéressant et certainement une solution qui fonctionne mais quand je veux afficher les 4 produits une ligne au lieu de 3, j'ai modifier ma structure de données, je préfère, pour rester dans le "champ d'application" de la pure fonctionnalité d'affichage ...
- Je vois, alors vous devriez probobly itérer en morceaux comme dans Ariel réponse, vous pouvez également trouver ce post stackoverflow.com/questions/18564888/... utile.
- Je pense que c'est exactement ce que vous êtes à la recherche de: stackoverflow.com/a/30426750/1943442
- connexes stackoverflow.com/a/25838091/759452
- github.com/jeevasusej/bootstrapRowSplitter
Vous devez vous connecter pour publier un commentaire.
Haut voté réponse, bien qu'efficace, n'est pas ce que je considère être l'angulaire, ni est-il en utilisant bootstrap propres classes qui sont destinés à faire face à cette situation. Comme @claies mentionné, la
.clearfix
classe est destinée à de telles situations. À mon avis, le plus propre de la mise en œuvre est comme suit:Cette structure permet d'éviter de désordre de l'indexation des produits de tableau, permet de nettoyer la notation point, et rend l'utilisation de la clearfix classe pour son usage prévu.
ng-if
déclarations sur le deuxième enfant div de lang-repeat
. Quelque chose comme,<div class="col-sm-4" ng-if="products.length > 1">
avec un autre<div class="col-sm-12" ng-if="products.length == 1">
. Ce serait le travail aussi longtemps que vous n'êtes pas à parcourir des centaines d'articles (et donc la création de centaines de montres)Je sais c'est un peu tard, mais il reste peut-être aider quelqu'un. J'ai fait comme ceci:
jsfiddle
ng-if="$index+1 < products.length"
etng-if="$index+2 < products.length"
{{product=products[$index];""}}
$index +1
et ainsi de suite. Remarque dans son exemple, il a crée 3 divs, pour $indice, $index +1 et $index + 2.Bon, cette solution est loin plus simples que celles déjà ici, et permet à différentes largeurs de colonne pour les différentes largeurs.
Noter que le
% 6
partie est supposé être égal au nombre de colonnes de ce type. Donc, si sur la colonne de l'élément que vous avez la classecol-lg-2
il y aura 6 colonnes, de sorte que l'utilisation... % 6
.Cette technique (à l'exclusion de la
ng-if
) est documentée ici: Bootstrap docsTout ce que vous voulez accomplir peut être utile, il y a une autre option, je crois que vous pourriez être dominant, qui est beaucoup plus simple.
Vous sont corrects, le Bootstrap tables de la loi étrange lorsque vous avez des colonnes qui ne sont pas à hauteur fixe. Cependant, il existe une classe de bootstrap créée pour lutter contre ce problème et d'effectuer sensible réinitialise.
il suffit de créer un vide
<div class="clearfix"></div>
avant le début de chaque nouvelle ligne pour permettre à la flotte de réinitialiser et les colonnes de retourner à leurs positions correctes.ici est un bootply.
flex
de faire des colonnes de même hauteur?Merci pour vos suggestions, tu m'as eu sur le droit chemin !
C'est parti pour une explication complète :
Par défaut AngularJS http get requête retourne un objet
Donc, si vous voulez utiliser @Ariel Tableau.le prototype.bloc fonction, vous devez d'abord transformer les objets dans un tableau.
Puis d'utiliser le bloc fonction DANS VOTRE CONTRÔLEUR sinon, si elle est utilisée directement dans ng-repeat, il vous amène à une infdig erreur. Le contrôleur final ressemble :
Et HTML devient :
De l'autre côté, j'ai décidé de retourner directement un tableau [] au lieu d'un objet {} à partir de mon fichier JSON. De cette façon, le contrôleur devient (veuillez noter que la syntaxe spécifique à la isArray:vrai) :
HTML rester le même que ci-dessus.
OPTIMISATION
Dernière question en suspens est : comment faire pour le rendre 100% AngularJS sans extension de javascript tableau avec bloc de fonction ... si certaines personnes sont intéressées à nous montrer si ng-repeat, lancez-ng-repeat-end sont la voie à suivre ... je suis curieuse 😉
ANDREW SOLUTION
Grâce à @Andrew, nous savons maintenant que l'ajout d'un bootstrap clearfix classe tous les trois (ou quel que soit le nombre) de l'élément corrige le problème d'affichage de différents bloc de hauteur.
Donc HTML devient :
Et votre contrôleur reste assez soft avec retiré chunck fonction :
Basé sur Alpar la solution, en utilisant uniquement des modèles avec des anidated ng-repeat. Fonctionne à la fois complète et partielle des lignes vides:
JSFiddle
Vous pouvez le faire sans une directive, mais je ne suis pas sûr que c'est la meilleure façon.
Pour ce faire, vous devez créer la matrice de la matrice de données que vous souhaitez afficher dans le tableau,
et après que l'utilisation de 2 ng-repeat pour parcourir le tableau.
pour créer le tableau pour l'affichage utilisez cette fonction que les produits.chunk(3)
et puis faire quelque chose comme ça à l'aide de 2 ng-repeat
J'ai juste fait une solution de travailler uniquement dans le modèle.
La solution est
Point est à l'aide de données deux fois, une pour un en dehors de la boucle.
Extra balises span restera, mais il dépend de la façon dont vous hors commerce.
Si c'est un 3 colonnes, ça va être comme
Honnêtement, je voulais
Bien que ça ne fonctionne pas.
Juste une autre petite amélioration sur @Duncan répondre et les autres des réponses basées sur clearfix élément.
Si vous voulez rendre le contenu cliquable vous aurez besoin d'un
z-index
> 0 ou clearfix du chevauchement entre le contenu et gérer le clic.C'est le exemple ne fonctionne pas (vous ne pouvez pas voir le pointeur du curseur et en cliquant sur, ne fait rien):
Alors que c'est le fixe:
J'ai ajouté
z-index: 1
pour avoir le contenu lever sur la clearfix et j'ai enlevé le div conteneur en utilisant à la placeng-repeat-start
etng-repeat-end
(disponible à partir d'AngularJS 1.2) parce qu'il fait de z-index ne fonctionne pas.Espérons que cette aide!
Mise à jour
Plunker: http://plnkr.co/edit/4w5wZj
flex
dans les lignes pour faire des colonnes de même hauteur?j'ai résolu ce problème en utilisant ng-classe
La meilleure façon d'appliquer une classe est d'utiliser ng-classe.Il peut être utilisé pour appliquer des classes sur la base d'une condition.
et puis dans votre contrôleur
Peu de modification dans @alpar 's solution
jsfiddle
Après la combinaison de nombreuses réponses et suggestions ici, c'est ma dernière réponse, qui fonctionne bien avec
flex
, ce qui nous permet de faire des colonnes avec une égale hauteur, il vérifie également le dernier index, et vous n'avez pas besoin de répéter l'intérieur HTML. Il n'utilise pasclearfix
:Il va afficher quelque chose comme ceci:
Cela a fonctionné pour moi, pas d'épissage ou de n'importe quoi:
HTML
JavaScript
Né Solutions à son meilleur, juste besoin d'un peu ajustez les pieds les besoins, j'ai eu différents sensible des solutions et un peu changé
Mise À Jour 2019 - Bootstrap 4
Depuis Bootstrap 3 flotteurs, il est nécessaire de clearfix réinitialise chaque n (3 ou 4) colonnes (
.col-*
) dans le.row
pour éviter inégale habillage de colonnes.Maintenant que Bootstrap 4 utilise flexbox, il n'est plus besoin d'envelopper les colonnes distinctes
.row
balises, ou pour insérer supplémentaire divs à force de cols pour envelopper chaque n colonnes.Vous pouvez simplement répéter tous des colonnes en une seule
.row
conteneur.Par exemple 3 colonnes dans chaque visuel ligne est:
Donc pour l'Amorçage du ng-repeat est tout simplement:
Démo: https://www.codeply.com/go/Z3IjLRsJXX
Je l'ai fait uniquement à l'aide de bootstrap, vous devez être très prudent dans l'emplacement de la ligne et la colonne, voici mon exemple.
HTML:
Bâtiment sur Alpar réponse, voici un plus généralisée de la façon de diviser une seule liste d'articles dans plusieurs contenants (des lignes, des colonnes, des seaux, peu importe):
pour une liste de 10 éléments, génère:
Le nombre de conteneurs peuvent être rapidement codées dans une fonction de contrôleur:
JS (ES6)
HTML
Cette approche évite de dupliquer l'élément de balisage (
<span>{{item.name}}</span>
dans ce cas) dans le modèle source - pas un gain énorme pour une simple étendue, mais de plus en plus complexes, DOM structure (que j'ai eu) cela permet de garder le modèle de SÈCHE.