Ich verwende ng-repeat mit meinem Code. Ich habe 'n' Anzahl von Textfeldern basierend auf ng-repeat. Ich möchte das Textfeld an drei Spalten ausrichten.
Das ist mein 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>
Antworten:
Der zuverlässigste und technisch korrekteste Ansatz besteht darin, die Daten in der Steuerung zu transformieren. Hier ist eine einfache Chunk-Funktion und Verwendung.
Dann würde Ihre Ansicht folgendermaßen aussehen:
Wenn Sie Eingaben innerhalb von haben
ng-repeat
, möchten Sie wahrscheinlich die Arrays aufheben / wieder verbinden, wenn die Daten geändert werden oder wenn sie gesendet werden. So würde dies in a aussehen$watch
, sodass die Daten immer im ursprünglichen, zusammengeführten Format verfügbar sind:Viele Menschen bevorzugen es, dies in der Ansicht mit einem Filter zu erreichen. Dies ist möglich, sollte aber nur zu Anzeigezwecken verwendet werden! Wenn Sie Eingaben in dieser gefilterten Ansicht hinzufügen, wird es Probleme verursachen, kann gelöst werden, aber sind nicht hübsch oder zuverlässig .
Das Problem mit diesem Filter ist, dass er jedes Mal neue verschachtelte Arrays zurückgibt. Angular beobachtet den Rückgabewert vom Filter. Wenn der Filter zum ersten Mal ausgeführt wird, kennt Angular den Wert und führt ihn dann erneut aus, um sicherzustellen, dass die Änderung abgeschlossen ist. Wenn beide Werte gleich sind, wird der Zyklus beendet. Wenn nicht, wird der Filter immer wieder ausgelöst, bis sie gleich sind, oder Angular erkennt, dass eine unendliche Digest-Schleife auftritt, und fährt herunter. Da neue verschachtelte Arrays / Objekte zuvor nicht von Angular verfolgt wurden, unterscheidet sich der Rückgabewert immer vom vorherigen. Um diese "instabilen" Filter zu beheben, müssen Sie den Filter in eine
memoize
Funktion einschließen.lodash
hat einememoize
Funktion und die neueste Version von lodash enthält auch einechunk
Funktion, so dass wir diesen Filter sehr einfach mit erstellen könnennpm
Module und Kompilieren des Skripts mitbrowserify
oderwebpack
.Denken Sie daran: Nur anzeigen! Filtern Sie im Controller, wenn Sie Eingänge verwenden!
Installiere lodash:
Erstellen Sie den Filter:
Und hier ist ein Beispiel mit diesem Filter:
Artikel vertikal bestellen
In Bezug auf vertikale Spalten (Liste von oben nach unten) und nicht horizontal (von links nach rechts) hängt die genaue Implementierung von der gewünschten Semantik ab. Listen, die sich ungleichmäßig aufteilen, können auf verschiedene Arten verteilt werden. Hier ist eine Möglichkeit:
Der direkteste und einfachste Weg, um Spalten abzurufen, ist die Verwendung von CSS-Spalten :
quelle
a b c
zweiten Zeile and e f
. Kann icha b
in der ersten Spaltec d
in der zweiten Spalte unde f
in der dritten Spalte anzeigen ? Danke[].concat.call([], val)
. Sie müssen überlegen, wasapply
tut.val
ist ein Array von Arrays, und wir möchten jedes dieser Arrays als Argumente an dieses Array übergebenconcat
. Ich denke, Sie konzentrieren sich auf den Kontext von[]
, worum es hier nicht geht. Was wir wollen, ist[].concat(val[1], val[2], val[3], etc)
, also brauchen wirapply([], val)
[]
vs[[]]
und zurückgibt[{}]
. Das verschachtelte Array / Objekt lässt Angular bei jedem ein anderes Ergebnis sehenfilter
und wiederholt immer wieder, dass das Ergebnis gleich bleibt (stabilisieren).var x = [1,2,3]; var y = [1,2,3]; console.log(x === y);
Tiefenprüfung bedeutet entweder, Zeichenfolgen zu stringifizieren und zu vergleichen, was riskant ist, da ein Objekt möglicherweise nicht stringifizierbar ist, oder jede Eigenschaft einzeln rekursiv zu überprüfen. Ich denke, Angular könnte das für Filter implementieren, aber ich bin mir sicher, dass es einen guten Grund dafür gibt. Wahrscheinlich, weil sie hauptsächlich Filter für die einfache Änderung eines Datensatzes vorsahen, nicht für eine vollständige Überarbeitung mit Änderungen an der Struktur.Diese Lösung ist sehr einfach:
JSON:
HTML:
DEMO in FIDDLE
quelle
ng-switch-when="0"
auf ein äußeres Div anstatt auf alle 3 Elemente setzen.Eine saubere, anpassungsfähige Lösung, die keine Datenmanipulation erfordert :
Der HTML:
Das CSS:
Das JavaScript:
Dies ist eine einfache Lösung zum dynamischen Rendern von Daten in Zeilen und Spalten, ohne dass das Datenarray, das Sie anzeigen möchten, bearbeitet werden muss. Wenn Sie versuchen, die Größe des Browserfensters zu ändern, wird das Raster dynamisch an die Größe des Bildschirms / Div angepasst.
(Ich habe Ihrer ID auch ein Suffix {{$ index}} hinzugefügt, da ng-repeat versucht, mehrere Elemente mit derselben ID zu erstellen, wenn Sie dies nicht tun.)
Ein ähnliches Arbeitsbeispiel
quelle
<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>
Das ist im "Modalkörper".Die Antwort von m59 ist ziemlich gut. Das einzige, was ich daran nicht mag, ist, dass es
div
s für möglicherweise Daten für eine Tabelle verwendet.In Verbindung mit dem Filter von m59 (Antwort irgendwo oben) erfahren Sie hier, wie Sie ihn in einer Tabelle anzeigen.
quelle
Das Folgende ist einfacher:
Die Antwort von Cumulo Nimbus ist nützlich für mich, aber ich möchte, dass dieses Raster von einem Div umschlossen wird, das die Bildlaufleiste anzeigen kann, wenn die Liste zu lang ist.
Um dies zu erreichen, habe ich
style="height:200px; overflow:auto"
ein Div um die Tabelle hinzugefügt , wodurch es als einzelne Spalte angezeigt wird.Funktioniert jetzt für eine Array-Länge von eins.
quelle
ng-hide="$index%2!==0"
Ich habe eine Funktion und habe sie in einem Dienst gespeichert, damit ich sie in meiner gesamten App verwenden kann:
Bedienung:
});
Regler:
Markup:
quelle
Mein Ansatz war eine Mischung aus Dingen.
Mein Ziel war es, ein Raster zu haben, das sich an die Bildschirmgröße anpasst. Ich wollte 3 Spalten für
lg
, 2 Spalten fürsm
undmd
und 1 Spalte fürxs
.Zuerst habe ich die folgende Bereichsfunktion mithilfe des Winkelservices erstellt
$window
:Dann habe ich die von @Cumulo Nimbus vorgeschlagene Klasse verwendet:
In dem div, das das enthält
ng-repeat
, habe ich dieresizable
Direktive hinzugefügt , wie auf dieser Seite erläutert , damit bei jeder Größenänderung des Fensters der Winkeldienst$window
mit den neuen Werten aktualisiert wird.Letztendlich habe ich in der wiederholten Div:
Bitte lassen Sie mich alle Mängel in diesem Ansatz wissen.
Hoffe es kann hilfreich sein.
quelle
Ein einfacher Trick mit "Clearfix" -CSS, der von Bootstrap empfohlen wird:
Viele Vorteile: Effizient, schnell, mit Boostrap-Empfehlungen, Vermeidung möglicher $ Digest-Probleme und ohne Änderung des Angular-Modells.
quelle
In diesem Beispiel wird ein verschachtelter Repeater erstellt, bei dem die äußeren Daten ein inneres Array enthalten, das ich in zwei Spalten auflisten wollte. Das Konzept würde für drei oder mehr Spalten gelten.
In der inneren Spalte wiederhole ich die "Zeile" bis das Limit erreicht ist. Die Grenze wird bestimmt, indem die Länge des Arrays von Elementen durch die Anzahl der gewünschten Spalten dividiert wird, in diesem Fall durch zwei. Die Divisionsmethode befindet sich auf dem Controller und übergibt die aktuelle Array-Länge als Parameter. Die JavaScript-Slice-Funktion (0, array.length / columnCount) hat dann das Limit auf den Repeater angewendet.
Der zweite Spaltenwiederholer wird dann aufgerufen und wiederholt das Slice (array.length / columnCount, array.length), das die zweite Hälfte des Arrays in Spalte zwei erzeugt.
Ich hoffe, dies hilft, die Lösung auf eine andere Weise zu betrachten. (PS das ist mein erster Beitrag hier! :-))
quelle
Ich repariere ohne .row
und css
quelle
Hier ist eine einfache Möglichkeit, dies zu tun. Es ist mehr manuell und endet mit unordentlichem Markup. Ich empfehle dies nicht, aber es gibt Situationen, in denen dies nützlich sein könnte.
Hier ist ein Geigenlink http://jsfiddle.net/m0nk3y/9wcbpydq/
HTML:
JS:
Für dieses Setup müssen wir etwas Mathematik für das Markup verwenden: /, daher müssen Sie Mathematik einfügen, indem Sie diese Zeile hinzufügen:
$scope.Math = Math;
quelle
Alle diese Antworten scheinen massiv überarbeitet zu sein.
Die bei weitem einfachste Methode wäre, die Eingabedivs in einem col-md-4-Spalten-Bootstrap einzurichten. Bootstrap formatiert sie dann aufgrund der 12-Spalten-Natur des Bootstraps automatisch in 3 Spalten:
quelle
quelle
Basierend auf der sehr guten Antwort von m59. Ich habe festgestellt, dass Modelleingaben unscharf werden, wenn sie sich ändern, sodass Sie jeweils nur ein Zeichen ändern können. Dies ist eine neue Liste von Objekten für alle, die sie benötigen:
Und das wäre die Verwendung:
quelle
Ich bin neu in Bootstrap und AngularJs, aber dies könnte auch Array pro 4 Elemente als eine Gruppe machen, das Ergebnis wird fast 3 Spalten mögen. Dieser Trick verwendet das Bootstrap-Break-Line-Prinzip.
quelle
In Lodash ist jetzt eine Chunk-Methode integriert, die ich persönlich verwende: https://lodash.com/docs#chunk
Auf dieser Grundlage könnte der Controller-Code wie folgt aussehen:
Code anzeigen:
quelle
Ein anderer Weg ist
width:33.33%; float:left
ein Wrapper-Div wie folgt :quelle
Ich befand mich in einem ähnlichen Fall und wollte Anzeigegruppen mit jeweils 3 Spalten generieren. Obwohl ich Bootstrap verwendet habe, habe ich versucht, diese Gruppen in verschiedene übergeordnete Divs zu unterteilen. Ich wollte auch etwas allgemein Nützliches machen.
Ich näherte mich mit 2
ng-repeat
wie folgt:Dies macht es sehr einfach, zu einer anderen Anzahl von Spalten zu wechseln und in mehrere übergeordnete Divs aufzuteilen.
quelle
Nur für den Fall, dass jemand ein Angular 7 (und eine höhere Version) möchte, ist hier ein Beispiel, das ich in einer meiner Anwendungen verwendet habe:
HTML:
.TS DATEI
Dies ist eine großartige Lösung zum dynamischen Erstellen neuer Spalten / Zeilen, je nachdem, wie viele Elemente Sie aus der Datenbank iterieren. Vielen Dank!
quelle
Dies beantwortet die ursprüngliche Frage, wie man 1,2,3 in einer Spalte erhält. - gefragt von Kupu 8. Februar 14 um 13:47 Uhr
anglejs code:
Code anzeigen (Hinweis: Verwenden von Bootstrap 3):
quelle
Dieser Code hilft dabei, die Elemente mit drei Spalten im lg- und md-Modus, zwei Spalten im sm-Modus und einer einzelnen Spalte im xs-Modus auszurichten
quelle