Gibt es eine Möglichkeit, ng-repeat
eine definierte Anzahl von Malen festzulegen, anstatt immer über ein Array iterieren zu müssen?
Im Folgenden möchte ich beispielsweise, dass das Listenelement fünfmal angezeigt wird, wobei angenommen wird $scope.number
, dass es zusätzlich zu der Anzahl gleich 5 ist, sodass jedes Listenelement wie 1, 2, 3, 4, 5 inkrementiert
Erwünschtes Ergebnis:
<ul>
<li><span>1</span></li>
<li><span>2</span></li>
<li><span>3</span></li>
<li><span>4</span></li>
<li><span>5</span></li>
</ul>
javascript
html
angularjs
angularjs-ng-repeat
Malcr001
quelle
quelle
Antworten:
Update (25.09.2008)
In neueren Versionen von AngularJS (> = 1.3.0) können Sie dies nur mit einer Variablen tun (keine Funktion erforderlich):
Dies war zum Zeitpunkt der ersten Frage nicht möglich. Dank an @Nikhil Nambiar aus seiner Antwort unten für dieses Update
Original (29.05.2013)
Im Moment
ng-repeat
akzeptiert nur eine Sammlung als Parameter, aber Sie können dies tun:Und irgendwo in Ihrem Controller:
Auf diese Weise können Sie nach Belieben
$scope.number
zu einer beliebigen Nummer wechseln und die gesuchte Bindung beibehalten.BEARBEITEN (06.01.2014) - Neuere Versionen von AngularJS (> = 1.1.5) erfordern
track by $index
:Hier ist eine Geige mit ein paar Listen, die dieselbe
getNumber
Funktion verwenden.quelle
du kannst das:
quelle
Hier ist ein Beispiel, wie Sie dies tun können. Beachten Sie, dass ich von einem Kommentar in den ng-repeat-Dokumenten inspiriert wurde: http://jsfiddle.net/digitalzebra/wnWY6/
Beachten Sie die ng-repeat-Direktive:
Hier ist der Controller:
quelle
_.range
das Array auch mit Underscore oder lodash erstellen: $ scope.range = _.range (0, n);Ich denke, diese jsFiddle aus diesem Thread könnte das sein, wonach Sie suchen.
quelle
$scope.number
gleich 5 anzunehmen ". Die Absicht war, eine Ganzzahlvariable zu verwenden, um die Anzahl der Elemente zu definieren, sie nicht fest zu codieren und kein vordefiniertes Array zu verwenden.$scope.limit = 2
) setzen und es verwenden wie...|limitTo:limit
- siehe aktualisierte GeigeEin einfacherer Ansatz wäre (für ein Beispiel von 5 Mal):
quelle
Array(5)
(oder um tatsächlich[...Array(5).keys()]
ein Array [0,1,2,3,4] zu erhalten)Ich bin auf dasselbe Problem gestoßen. Ich bin auf diesen Thread gestoßen, mochte aber nicht die Methoden, die sie hier hatten. Meine Lösung war die Verwendung von underscore.js, die wir bereits installiert hatten. So einfach ist das:
Dies wird genau das tun, wonach Sie suchen.
quelle
$scope._ = _
.$rootScope
damit es überall verwendet werden kann. Setzen Sie dies in Ihreapp.run
Funktion kurz nach demapp.config
:app.run(function ($rootScope) { $rootScope._ = _; });
Ich wollte mein HTML sehr minimal halten, also definierte ich einen kleinen Filter, der das Array [0,1,2, ...] wie andere erstellt:
Danach kann die Ansicht folgendermaßen verwendet werden:
quelle
Das ist wirklich hässlich, aber es funktioniert ohne Controller für eine Ganzzahl oder eine Variable:
ganze Zahl:
Variable:
quelle
_ in (_ = []).length = 33; _ track by $index
etwas kleinerEs gibt viele Möglichkeiten, dies zu tun. Ich war wirklich besorgt darüber, die Logik in meinem Controller zu haben, also habe ich eine einfache Anweisung erstellt, um das Problem der n-fachen Wiederholung eines Elements zu lösen.
Installation:
Die Direktive kann mit installiert werden
bower install angular-repeat-n
Beispiel:
produziert:
1234
Es funktioniert auch mit einer Bereichsvariablen:
Quelle:
Github
quelle
Dies ist nur eine geringfügige Abweichung von der akzeptierten Antwort, aber Sie müssen keine neue Funktion erstellen . Nur um 'Array' in den Bereich zu importieren:
Sehen Sie sich diese Geige als Live-Beispiel an.
quelle
Einfachste Antwort: 2 Codezeilen
JS (in Ihrem AngularJS-Controller)
HTML
... wo
repeatCount
ist die Anzahl der Wiederholungen, die an dieser Stelle erscheinen sollen.quelle
repeatCount
eine tatsächliche Zahl im HTML ersetzen. Solange diese Zahl kleiner oder gleich istMAX_REPEATS
, können Sie die Zahl festlegen von Wiederholungen im HTML.ngRepeat
Richtlinie einzuschränken . VerwendenArray.prototype.slice
und idiomatisches JS sollte immer einer Bibliothek wie underscore.js vorgezogen werden (je nach Browserkompatibilität).eckig gibt eine sehr süße Funktion namens Scheibe . Mit dieser können Sie erreichen, was Sie suchen. zB ng-repeat = "ab in abc.slice (startIndex, endIndex)"
Diese Demo: http://jsfiddle.net/sahilosheal/LurcV/39/ hilft Ihnen dabei und erklärt Ihnen, wie Sie diese Funktion "Das Leben leichter machen" verwenden können. :) :)
html:
CSS:
ng-JS:
quelle
Hier ist eine Antwort für Winkel 1.2.x.
Grundsätzlich ist es das gleiche, mit der geringfügigen Änderung der
ng-repeat
Hier ist die Geige: http://jsfiddle.net/cHQLH/153/
Dies liegt daran, dass Winkel 1.2 keine doppelten Werte in der Direktive zulässt. Dies bedeutet, dass Sie eine Fehlermeldung erhalten, wenn Sie Folgendes versuchen.
quelle
Du kannst den ... benutzen
ng-if
Direktive mit verwendenng-repeat
Wenn also num die Häufigkeit ist, mit der das Element wiederholt werden muss:
quelle
ng-repeat
auf diese Weise weiterhin die kommentierten Tags (<!-- ngIf: $index < num -->
usw.) ausgibt . Es gibt einfach keineli
Elemente, die das DOM rendern kann. Überprüfen Sie hier im Ergebnisbereich eine "Ansichtsquelle", um zu sehen, was ich meine.Sie können dieses Beispiel verwenden.
Innerhalb des Controllers:
Beispiel für ein Auswahlelement auf der HTML-Codeseite:
quelle
Für Benutzer, die CoffeeScript verwenden, können Sie ein Bereichsverständnis verwenden:
Richtlinie
oder Controller
Vorlage
quelle
Wenn Sie die erste Antwort von Ivan ein wenig erweitern, können Sie einen String als Sammlung ohne Track-by-Anweisung verwenden, solange die Zeichen eindeutig sind. Wenn der Anwendungsfall also weniger als 10 Zahlen umfasst, wie ich es einfach tun würde ::
Das ist ein bisschen ruckelig, sicher, aber einfach genug anzusehen und nicht besonders verwirrend.
quelle
Erstellen Sie zunächst mit LoDash einen Winkelfilter:
Die LoDash-Zeitfunktion kann null, undefiniert, 0, Zahlen und Zeichenfolgendarstellung von Zahlen verarbeiten.
Verwenden Sie es dann in Ihrem HTML wie folgt:
oder
quelle
Ich brauchte eine dynamischere Lösung dafür - wo ich die Wiederholung erhöhen konnte.
HTML
Duplikatorsteuerung
JS
quelle
Angular bietet Filter zum Ändern einer Sammlung. In diesem Fall wäre die Auflistung null, dh [], und der Filter akzeptiert auch folgende Argumente:
JS:
Diese Methode ist den oben vorgeschlagenen sehr ähnlich und nicht unbedingt überlegen, zeigt jedoch die Leistung von Filtern in AngularJS.
quelle
Wenn n nicht zu hoch ist, kann eine andere Option darin bestehen, split ('') mit einer Zeichenfolge von n Zeichen zu verwenden:
quelle
Ich bin auf dasselbe Problem gestoßen und habe Folgendes herausgefunden:
... und das HTML:
LIVE BEISPIEL
Ich habe die
times
Funktion des Unterstrichs verwendet, da wir sie bereits im Projekt verwendet haben, aber Sie können sie leicht durch nativen Code ersetzen.quelle
Ich erstelle eine wiederverwendbare Direktive, bei der die maximale Anzahl aus einer anderen ng-Wiederholung stammt. Dies ist also eine Bearbeitung der am besten bewerteten Antwort.
Ändern Sie einfach den Code am Controller in diesen -
Dies gibt ein neues Array mit der angegebenen Anzahl von Iterationen zurück
quelle
Da es über eine Zeichenfolge iteriert, wird für jedes Zeichen ein Element gerendert:
Wir können diese hässliche Problemumgehung ohne Code mithilfe des
number|n decimal places
nativen Filters verwenden.Auf diese Weise haben wir
mynumber
Elemente ohne zusätzlichen Code. Sagen Sie'0.000'
.Wir verwenden
mynumber - 2
, um zu kompensieren.0.
Es funktioniert nicht für Zahlen unter 3, kann aber in einigen Fällen nützlich sein.
quelle
track by $index
?ng-repeat="i in [1,2,3,4]"
$scope.number
aaaa
war ein Beispiel, um meine - nicht sehr elegante - Problemumgehung zu erklären. Wenn Sie 'aaaa' oder 'abcd' fest codieren, erhalten Sie eine Liste mit fester Länge. Wenn Sie jedochmynumber-2
Dezimalstellen zu 0 hinzufügen , erhalten Sie eine 'Zeichenfolge' mitmynumber
Zeichen. Sagen wirmynumber=5
, Sie bekommen'0.000'
, dann wiederholen wir das mit $ indexquelle
einfacher Weg:
in der Komponente / Steuerung und dann:
Dieser Code stammt aus meinem Typoskript-Projekt, könnte aber in reines Javascript umgewandelt werden
quelle