Ich habe darüber in anderen Posts gelesen, konnte es aber nicht herausfinden.
Ich habe ein Array,
$scope.items = [
{ID: '000001', Title: 'Chicago'},
{ID: '000002', Title: 'New York'},
{ID: '000003', Title: 'Washington'},
];
Ich möchte es rendern als:
<select>
<option value="000001">Chicago</option>
<option value="000002">New York</option>
<option value="000003">Washington</option>
</select>
Außerdem möchte ich die Option mit ID = 000002 auswählen.
Ich habe select gelesen und versucht, aber ich kann es nicht herausfinden.
javascript
angularjs
html-select
ng-options
Andrej Kaurin
quelle
quelle
Antworten:
Eine Sache zu beachten ist, dass ngModel erforderlich ist , damit ngOptions funktioniert ... Beachten Sie das,
ng-model="blah"
was sagt "setze $ scope.blah auf den ausgewählten Wert".Versuche dies:
Hier ist mehr aus der Dokumentation von AngularJS (falls Sie es nicht gesehen haben):
Zur Verdeutlichung der Options-Tag-Werte in AngularJS:
Wenn Sie verwenden
ng-options
, sind die Werte von Options-Tags, die von ng-options geschrieben wurden, immer der Index des Array-Elements, auf das sich das Options-Tag bezieht . Dies liegt daran, dass Sie mit AngularJS tatsächlich ganze Objekte mit ausgewählten Steuerelementen auswählen können und nicht nur primitive Typen. Zum Beispiel:Mit dem obigen Befehl können Sie ein gesamtes Objekt
$scope.selectedItem
direkt auswählen . Der Punkt ist, dass Sie sich mit AngularJS keine Gedanken darüber machen müssen, was in Ihrem Options-Tag enthalten ist. Lassen Sie AngularJS damit umgehen; Sie sollten sich nur darum kümmern, was in Ihrem Modell in Ihrem Bereich enthalten ist.Hier ist ein Plunker, der das obige Verhalten demonstriert und den ausgeschriebenen HTML-Code zeigt
Umgang mit der Standardoption:
Es gibt einige Dinge, die ich oben in Bezug auf die Standardoption nicht erwähnt habe.
Auswahl der ersten Option und Entfernen der leeren Option:
Sie können dies tun, indem Sie ein einfaches hinzufügen
ng-init
, das das Modell (vonng-model
) auf das erste Element in den Elementen setzt, in denen Sie sich wiederholenng-options
:Hinweis: Dies könnte etwas verrückt werden, wenn
foo
es richtig auf etwas "Falsches" initialisiert wird. In diesem Fall möchten Siefoo
höchstwahrscheinlich die Initialisierung in Ihrem Controller durchführen.Anpassen der Standardoption:
Das ist etwas anders; Hier müssen Sie lediglich ein Options-Tag als untergeordnetes Element Ihrer Auswahl mit einem leeren Wertattribut hinzufügen und dann den inneren Text anpassen:
Hinweis: In diesem Fall bleibt die Option "leer" auch nach Auswahl einer anderen Option erhalten. Dies ist nicht der Fall für das Standardverhalten von Auswahlen unter AngularJS.
Eine benutzerdefinierte Standardoption, die ausgeblendet wird, nachdem eine Auswahl getroffen wurde:
Wenn Sie möchten, dass Ihre angepasste Standardoption nach Auswahl eines Werts nicht mehr angezeigt wird, können Sie Ihrer Standardoption ein ng-hide-Attribut hinzufügen:
quelle
<option value="?" selected="selected"></option>
) zu vermeiden ?ng-if="foo"
ichng-if=!foo
die leere Standardoption ausblenden, wenn eine andere Option ausgewählt ist. Außerdem wird die leere Standardoption immer am Ende der Kombinationsliste angezeigt. Wie kann ich es an den Anfang der Combo-Liste setzen?Ich lerne AngularJS und hatte auch Probleme mit der Auswahl. Ich weiß, dass diese Frage bereits beantwortet ist, aber ich wollte trotzdem etwas mehr Code teilen.
In meinem Test habe ich zwei Listboxen: Automarken und Automodelle. Die Modellliste ist deaktiviert, bis eine Marke ausgewählt ist. Wenn die Auswahl in der Liste "Marken" später zurückgesetzt wird (auf "Marke auswählen" gesetzt), wird die Listenliste "Modelle" wieder deaktiviert UND die Auswahl wird ebenfalls zurückgesetzt (auf "Modell auswählen"). Marken werden als Ressource abgerufen, während Modelle nur fest codiert sind.
Macht JSON:
services.js:
HTML-Datei:
controller.js:
quelle
ng-model
sollte auf eine andere Variable in Ihrem Bereich verweisen , die nicht mit verwandt istmake
. Siehe das Beispiel in docs.angularjs.org/api/ng/directive/ngOptionsAus irgendeinem Grund lässt AngularJS mich verwirren. Ihre Dokumentation ist diesbezüglich ziemlich schrecklich. Weitere gute Beispiele für Variationen wären willkommen.
Wie auch immer, ich habe eine leichte Variation von Ben Leshs Antwort.
Meine Datensammlungen sehen folgendermaßen aus:
Jetzt
führte immer noch dazu, dass der Optionswert der Index war (0, 1, 2 usw.).
Hinzufügen von Track By hat es für mich behoben:
Ich gehe davon aus, dass es häufiger vorkommt, dass Sie einer Auswahlliste ein Array von Objekten hinzufügen möchten, also werde ich mich an dieses erinnern!
Beachten Sie, dass Sie ab AngularJS 1.4 keine ng-Optionen mehr verwenden können, sondern Folgendes für
ng-repeat
Ihr Options-Tag verwenden müssen:quelle
option
?Die Frage ist bereits beantwortet (übrigens, wirklich gute und umfassende Antwort von Ben), aber ich möchte der Vollständigkeit halber ein weiteres Element hinzufügen, das auch sehr praktisch sein kann.
In dem von Ben vorgeschlagenen Beispiel:
Das folgende ngOptions- Formular wurde verwendet :
select as label for value in array
.Label ist ein Ausdruck, dessen Ergebnis das Label für das
<option>
Element ist. In diesem Fall können Sie bestimmte Zeichenfolgenverkettungen ausführen, um komplexere Optionsbezeichnungen zu erhalten.Beispiele:
ng-options="item.ID as item.Title + ' - ' + item.ID for item in items"
gibt Ihnen Etiketten wieTitle - ID
ng-options="item.ID as item.Title + ' (' + item.Title.length + ')' for item in items"
gibt Ihnen Beschriftungen wieTitle (X)
, woX
ist die Länge der Titelzeichenfolge.Sie können auch Filter verwenden, z.
ng-options="item.ID as item.Title + ' (' + (item.Title | uppercase) + ')' for item in items"
gibt Ihnen Beschriftungen wieTitle (TITLE)
, wobei der Titelwert der Title-Eigenschaft und TITLE der gleiche Wert ist, jedoch in Großbuchstaben konvertiert wird.ng-options="item.ID as item.Title + ' (' + (item.SomeDate | date) + ')' for item in items"
gibt Ihnen Beschriftungen wieTitle (27 Sep 2015)
, wenn Ihr Modell eine Eigenschaft hatSomeDate
quelle
In CoffeeScript:
quelle
radix
fürparseInt
: http://davidwalsh.name/parseint-radixWenn Sie für jede Option einen benutzerdefinierten Titel benötigen,
ng-options
gilt dieser nicht. Verwenden Sie stattdessenng-repeat
mit Optionen:quelle
Ich hoffe, dass das Folgende für Sie funktioniert.
quelle
Es kann nützlich sein. Bindungen funktionieren nicht immer.
Beispielsweise füllen Sie das Quellmodell der Optionsliste aus einem REST-Service. Ein ausgewählter Wert war vor dem Ausfüllen der Liste bekannt und wurde festgelegt. Nach dem Ausführen der REST-Anforderung mit $ http ist die Listenoption abgeschlossen.
Die ausgewählte Option ist jedoch nicht festgelegt. Aus unbekannten Gründen bindet AngularJS beim Ausführen von Shadow $ Digest nicht ausgewählt, wie es sein sollte. Ich muss jQuery verwenden, um die Auswahl festzulegen. Es ist wichtig! AngularJS fügt im Schatten das Präfix zum Wert des attr "-Werts" hinzu, der durch ng-repeat-Optionen generiert wird. Für int ist es "number:".
quelle