J'utilise ng-repeat avec mon code J'ai un nombre 'n' de zone de texte basé sur ng-repeat. Je souhaite aligner la zone de texte sur trois colonnes.
c'est mon code
<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>
Réponses:
L'approche la plus fiable et la plus techniquement correcte consiste à transformer les données dans le contrôleur. Voici une simple fonction et utilisation de bloc.
Ensuite, votre vue ressemblerait à ceci:
Si vous avez des entrées dans le
ng-repeat
, vous voudrez probablement décoller / rejoindre les tableaux lorsque les données sont modifiées ou lors de la soumission. Voici à quoi cela ressemblerait dans un$watch
, de sorte que les données soient toujours disponibles dans le format d'origine fusionné:Beaucoup de gens préfèrent accomplir cela dans la vue avec un filtre. Ceci est possible, mais ne doit être utilisé qu'à des fins d'affichage! Si vous ajoutez des entrées dans cette vue filtrée, cela causera des problèmes qui peuvent être résolus, mais qui ne sont ni jolis ni fiables .
Le problème avec ce filtre est qu'il renvoie à chaque fois de nouveaux tableaux imbriqués. Angular surveille la valeur de retour du filtre. La première fois que le filtre s'exécute, Angular connaît la valeur, puis l'exécute à nouveau pour s'assurer qu'elle a bien été modifiée. Si les deux valeurs sont identiques, le cycle est terminé. Sinon, le filtre se déclenchera encore et encore jusqu'à ce qu'ils soient identiques, ou Angular se rend compte qu'une boucle de digestion infinie se produit et s'arrête. Étant donné que les nouveaux tableaux / objets imbriqués n'étaient pas précédemment suivis par Angular, il voit toujours la valeur de retour comme différente de la précédente. Pour corriger ces filtres "instables", vous devez envelopper le filtre dans une
memoize
fonction.lodash
a unememoize
fonction et la dernière version de lodash comprend également unechunk
fonction, nous pouvons donc créer ce filtre très simplement en utilisantnpm
modules et compiler le script avecbrowserify
ouwebpack
.N'oubliez pas: affichage uniquement! Filtrez dans le contrôleur si vous utilisez des entrées!
Installez lodash:
Créez le filtre:
Et voici un exemple avec ce filtre:
Commander les articles verticalement
Concernant les colonnes verticales (liste de haut en bas) plutôt qu'horizontales (de gauche à droite), l'implémentation exacte dépend de la sémantique souhaitée. Les listes qui se divisent de manière inégale peuvent être distribuées de différentes manières. Voici une façon:
Cependant, le moyen le plus direct et le plus simple d'obtenir des colonnes est d'utiliser des colonnes CSS :
la source
a b c
deuxième ligned e f
. Puis-je affichera b
dans la première colonnec d
de la deuxième colonne ete f
dans la troisième colonne? Merci[].concat.call([], val)
. Vous devez considérer ce queapply
fait.val
est un tableau de tableaux, et nous voulons passer chacun de ces tableaux à l'intérieur comme arguments àconcat
. Je pense que vous vous concentrez sur le contexte de[]
, ce qui n'est pas le but ici. Ce que nous voulons[].concat(val[1], val[2], val[3], etc)
, c'est donc nous avons besoinapply([], val)
[]
vs[[]]
et[{}]
. Le tableau / objet imbriqué permet à Angular de voir un résultat différent sur chaquefilter
, et continue de répéter à la recherche du résultat pour rester le même (stabiliser).var x = [1,2,3]; var y = [1,2,3]; console.log(x === y);
La vérification approfondie signifie soit la stringification et la comparaison de chaînes, ce qui est risqué car un objet peut ne pas être stringifiable, soit la vérification récursive de chaque propriété individuellement. Je pense qu'Angular pourrait implémenter cela pour les filtres, mais je suis sûr qu'il y a une bonne raison pour laquelle ils ne l'ont pas fait. Probablement parce qu'ils visaient principalement des filtres pour une simple modification d'un ensemble de données, et non une refonte complète avec des modifications de la structure.Cette solution est très simple:
JSON:
HTML:
DEMO dans FIDDLE
la source
ng-switch-when="0"
une fois sur un div externe au lieu de sur les 3 éléments.Une solution propre et adaptable qui ne nécessite pas de manipulation de données :
Le HTML:
Le CSS:
Le JavaScript:
Il s'agit d'une solution simple pour rendre les données en lignes et en colonnes de manière dynamique sans avoir à manipuler le tableau de données que vous essayez d'afficher. De plus, si vous essayez de redimensionner la fenêtre du navigateur, vous pouvez voir que la grille s'adapte dynamiquement à la taille de l'écran / div.
(J'ai également ajouté un suffixe {{$ index}} à votre identifiant car ng-repeat essaiera de créer plusieurs éléments avec le même identifiant si vous ne le faites pas.)
Un exemple de travail similaire
la source
<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>
C'est à l'intérieur de `modal-body '.La réponse de m59 est plutôt bonne. La seule chose que je n'aime pas, c'est qu'il utilise
div
s pour ce qui pourrait être des données pour une table.Donc, en conjonction avec le filtre de m59 (réponse quelque part ci-dessus), voici comment l'afficher dans un tableau.
la source
Voici un moyen plus simple:
La réponse de Cumulo Nimbus m'est utile mais je veux que cette grille soit entourée d'un div qui peut afficher la barre de défilement lorsque la liste est trop longue.
Pour ce faire, j'ai ajouté
style="height:200px; overflow:auto"
à un div autour de la table, ce qui l'affiche sous forme de colonne unique.Fonctionne maintenant pour une longueur de tableau de un.
la source
ng-hide="$index%2!==0"
J'ai une fonction et je l'ai stockée dans un service afin de pouvoir l'utiliser partout dans mon application:
Un service:
});
Manette:
Balisage:
la source
Mon approche était un mélange de choses.
Mon objectif était d'avoir une grille s'adaptant à la taille de l'écran. Je voulais 3 colonnes pour
lg
, 2 colonnes poursm
etmd
et 1 colonne pourxs
.Tout d'abord, j'ai créé la fonction d'étendue suivante, en utilisant le
$window
service angulaire :Ensuite, j'ai utilisé la classe proposée par @Cumulo Nimbus:
Dans le div contenant le
ng-repeat
, j'ai ajouté laresizable
directive, comme expliqué dans cette page , de sorte qu'à chaque fois que la fenêtre est redimensionnée, le$window
service angulaire est mis à jour avec les nouvelles valeurs.En fin de compte, dans le div répété, j'ai:
S'il vous plaît, faites-moi savoir les défauts de cette approche.
J'espère que cela peut être utile.
la source
Une astuce simple avec le CSS "clearfix" recommandé par Bootstrap:
De nombreux avantages: efficace, rapide, utilisant les recommandations Boostrap, évitant les éventuels problèmes de $ digest et ne modifiant pas le modèle angulaire.
la source
Cet exemple produit un répéteur imbriqué où les données externes incluent un tableau interne que je voulais répertorier dans deux colonnes. Le concept serait vrai pour trois colonnes ou plus.
Dans la colonne intérieure, je répète la «ligne» jusqu'à ce que la limite soit atteinte. La limite est déterminée en divisant la longueur du tableau d'éléments par le nombre de colonnes souhaité, dans ce cas par deux. La méthode de division se trouve sur le contrôleur et reçoit la longueur actuelle du tableau en tant que paramètre. La fonction de tranche JavaScript (0, array.length / columnCount) a ensuite appliqué la limite au répéteur.
Le deuxième répéteur de colonne est alors appelé et répète la tranche (array.length / columnCount, array.length) qui produit la seconde moitié du tableau dans la deuxième colonne.
J'espère que cela aidera à regarder la solution d'une autre manière encore. (PS c'est mon premier message ici! :-))
la source
Je répare sans .row
et css
la source
Voici une façon facile de le faire. C'est plus manuel et se termine par un balisage désordonné. Je ne le recommande pas, mais dans certaines situations, cela pourrait être utile.
Voici un lien de violon http://jsfiddle.net/m0nk3y/9wcbpydq/
HTML:
JS:
Cette configuration nous oblige à utiliser des Maths sur le balisage: /, vous devrez donc injecter Math en ajoutant cette ligne:
$scope.Math = Math;
la source
Toutes ces réponses semblent massivement surfaites.
La méthode de loin la plus simple serait de configurer les div d'entrée dans un bootstrap de colonne col-md-4, puis bootstrap le formatera automatiquement en 3 colonnes en raison de la nature de 12 colonnes du bootstrap:
la source
la source
Sur la base de la très bonne réponse de m59. J'ai trouvé que les entrées de modèle seraient floues si elles changeaient, donc vous ne pouviez changer qu'un caractère à la fois. Ceci est un nouveau pour les listes d'objets pour tous ceux qui en ont besoin:
Et ce serait l'utilisation:
la source
Je suis nouveau dans bootstrap et angularjs, mais cela pourrait également faire Array par 4 éléments en un seul groupe, le résultat ressemblera presque à 3 colonnes. Cette astuce utilise le principe de la ligne de rupture bootstrap.
la source
Lodash a maintenant une méthode chunk intégrée que j'utilise personnellement: https://lodash.com/docs#chunk
Sur cette base, le code du contrôleur peut ressembler à ce qui suit:
Afficher le code:
la source
Une autre méthode consiste à définir
width:33.33%; float:left
un div wrapper comme celui-ci:la source
Je me suis retrouvé dans un cas similaire, souhaitant générer des groupes d'affichage de 3 colonnes chacun. Cependant, bien que j'utilisais bootstrap, j'essayais de séparer ces groupes en différentes div parentales. Je voulais aussi créer quelque chose d'utile de manière générique.
Je l'ai approché avec 2
ng-repeat
comme ci-dessous:Cela rend très facile de passer à un nombre différent de colonnes et de les séparer en plusieurs div parent.
la source
Juste au cas où quelqu'un voudrait un Angular 7 (et une version supérieure), voici un exemple que j'ai utilisé dans l'une de mes applications:
HTML:
FICHIER .TS
C'est une solution géniale pour créer dynamiquement de nouvelles colonnes / lignes en fonction de la quantité d'éléments que vous itérez à partir de la base de données. Merci!
la source
cela répond à la question originale qui est de savoir comment obtenir 1,2,3 dans une colonne. - demandé par kuppu le 8 février 14 à 13:47
code angularjs:
Afficher le code (note: en utilisant bootstrap 3):
la source
Ce code aidera à aligner les éléments avec trois colonnes en mode lg et md, deux colonnes en mode sm et une colonne en mode xs
la source