Hier ist, was viele Leute (einschließlich mich) zu stören scheint.
Wenn ich die ng-options
Direktive in AngularJS verwende, um die Optionen für ein <select>
Tag auszufüllen , kann ich nicht herausfinden, wie der Wert für eine Option festgelegt wird. Die Dokumentation dazu ist wirklich unklar - zumindest für einen Simpleton wie mich.
Ich kann den Text für eine Option einfach so einstellen:
ng-options="select p.text for p in resultOptions"
Wann resultOptions
ist zum Beispiel:
[
{
"value": 1,
"text": "1st"
},
{
"value": 2,
"text": "2nd"
}
]
Es sollte (und ist wahrscheinlich) das Einfachste sein, die Optionswerte festzulegen, aber bisher verstehe ich es einfach nicht.
javascript
angularjs
Jukka Puranen
quelle
quelle
Antworten:
In Ihrem Fall sollte es sein
Aktualisieren
Mit den Aktualisierungen von AngularJS ist es jetzt möglich, den tatsächlichen Wert für das
value
Attribut desselect
Elements mittrack by
Ausdruck festzulegen.Wie man sich an dieses hässliche Zeug erinnert
An alle Menschen, die es schwer haben, sich an diese Syntaxform zu erinnern: Ich stimme zu, dass dies nicht die einfachste oder schönste Syntax ist. Diese Syntax ist eine Art erweiterte Version von Pythons Listenverständnis und dem Wissen, dass ich mich sehr leicht an die Syntax erinnern kann. Es ist ungefähr so:
Python-Code:
Dies ist eigentlich die gleiche Syntax wie die erste oben aufgeführte. In der
<select>
Regel müssen wir jedoch zwischen dem tatsächlichen Wert im Code und dem in a gezeigten Text (der Bezeichnung) unterscheiden<select>
Element unterscheiden.Wie brauchen wir
person.id
im Code, aber wir wollen dasid
dem Benutzer nicht zeigen ; wir wollen seinen Namen zeigen. Ebenso interessiert uns derperson.name
im Code nicht. Es kommt dasas
Schlüsselwort, um Sachen zu beschriften. So wird es:Oder stattdessen
person.id
könnten wir dieperson
Instanz / Referenz selbst benötigen . Siehe unten:Für JavaScript-Objekte gilt dieselbe Methode. Denken Sie daran, dass die Elemente im Objekt
(key, value)
paarweise dekonstruiert werden.quelle
Wie die Wertattribute ihren Wert erhalten:
In Ihrem Fall sollte es also sein:
quelle
Ich hatte auch dieses Problem. Ich konnte meinen Wert nicht in ng-options einstellen. Jede generierte Option wurde mit 0, 1, ..., n gesetzt.
Um es richtig zu machen, habe ich in meinen ng-Optionen so etwas gemacht:
HTML:
Ich benutze "track by", um alle meine Werte mit festzulegen
room.price
.(Dieses Beispiel ist zum Kotzen: Wenn mehr als ein Preis gleich wäre, würde der Code fehlschlagen. Achten Sie also darauf, unterschiedliche Werte zu haben.)
JSON:
Ich habe es aus dem Blog-Beitrag gelernt. Wie man den ursprünglich ausgewählten Wert eines ausgewählten Elements mit Angular.JS ng-options & track by festlegt .
Schau das Video. Es ist eine schöne Klasse :)
quelle
Wenn Sie den Wert Ihrer
option
Elemente ändern möchten, weil das Formular schließlich an den Server gesendet wird, anstatt dies zu tun,Du kannst das:
Der erwartete Wert wird dann über das Formular unter dem richtigen Namen gesendet.
quelle
<input type="hidden" name="text" value="{{ text }}" />
, würde ich verwendenng-value
. Also :<input type="hidden" name="text" ng-value="{{ text }}" />
.So senden Sie einen benutzerdefinierten Wert namens
my_hero
, der mit einem normalen Formular an den Server :JSON:
HTML:
Der Server erhält entweder
iron
odersuper
als Wert vonmy_hero
.Dies ähnelt der Antwort von @neemzy , gibt jedoch separate Daten für das
value
Attribut an.quelle
Es scheint
ng-options
kompliziert (möglicherweise frustrierend) zu sein, aber in Wirklichkeit haben wir ein Architekturproblem.AngularJS dient als MVC-Framework für eine dynamische HTML + JavaScript-Anwendung. Während die (V) iew-Komponente HTML- "Templating" bietet, besteht ihr Hauptzweck darin, Benutzeraktionen über einen Controller mit Änderungen im Modell zu verbinden. Daher besteht die geeignete Abstraktionsebene für die Arbeit in AngularJS darin, dass ein Auswahlelement einen Wert im Modell auf einen Wert aus einer Abfrage setzt .
ng-options
liefert dasfor
Schlüsselwort, um zu bestimmen, wie der Inhalt des Optionselements sein soll, dp.text for p in resultOptions
. H.ng-options
dasas
Schlüsselwort an, um anzugeben, welcher Wert dem Modell wie in bereitgestellt wirdk as v for (k,v) in objects
.Die richtige Lösung für dieses Problem ist dann architektonischer Natur und umfasst die Umgestaltung Ihres HTML-Codes, sodass das (M) -Geruch bei Bedarf die Serverkommunikation durchführt (anstatt dass der Benutzer ein Formular sendet ).
Wenn eine MVC-HTML-Seite für das jeweilige Problem nicht überarbeitet werden muss, verwenden Sie nur den HTML-Generierungsteil der AngularJS (V) iew-Komponente. Folgen Sie in diesem Fall demselben Muster, das zum Generieren von Elementen wie
<li />
's under<ul />
' verwendet wird, und platzieren Sie eine ng-Wiederholung auf einem Optionselement:Als kludge kann man das name-Attribut des select-Elements immer in ein verstecktes Eingabeelement verschieben:
quelle
"Note: ngOptions provides an iterator facility for the <option> element which should be used instead of ngRepeat when you want the select model to be bound to a non-string value. This is because an option element can only be bound to string values at present."
. Es wird keine Leistung erwähnt, lediglich, dass ngOptions eine Alternative zu ngRepeat ist.Du kannst das:
- UPDATE
Nach einigen Updates ist die Lösung von Benutzer frm.adiputra viel besser. Code:
quelle
Ich habe heute eine Weile mit diesem Problem zu kämpfen. Ich habe die AngularJS-Dokumentation, diesen und andere Beiträge sowie einige Blogs gelesen, zu denen sie führen. Sie alle haben mir geholfen, die feineren Details herauszufinden, aber am Ende scheint dies nur ein verwirrendes Thema zu sein. Hauptsächlich wegen der vielen syntaktischen Nuancen von
ng-options
.Am Ende kam es für mich darauf an, dass weniger mehr ist.
Bei einem wie folgt konfigurierten Bereich:
Dies ist alles, was ich brauchte, um das gewünschte Ergebnis zu erzielen:
Beachten Sie, dass ich nicht verwendet habe
track by
. Wenn Sietrack by
das ausgewählte Element verwenden, wird immer das Objekt zurückgegeben, das der FirmnessID entspricht, und nicht die FirmnessID selbst. Dies entspricht nun meinen Kriterien: Es sollte einen numerischen Wert anstelle des Objekts zurückgeben und zurng-options
Erzielung der Leistungsverbesserung verwendet werden, indem nicht für jede generierte Option ein neuer Bereich erstellt wird.Außerdem brauchte ich die leere erste Zeile, also fügte ich
<option>
dem<select>
Element einfach eine hinzu .Hier ist ein Plunkr , der meine Arbeit zeigt.
quelle
Anstatt die neue Funktion "Track by" zu verwenden, können Sie dies einfach mit einem Array tun, wenn die Werte mit dem Text übereinstimmen sollen:
Beachten Sie den Unterschied zwischen der Standardsyntax, die die Werte zu den Schlüsseln des Objekts / Arrays macht, und daher 0,1,2 usw. für ein Array:
k als v wird v als v .
Ich entdeckte dies nur aufgrund des gesunden Menschenverstandes, der die Syntax betrachtete. (k, v) ist die tatsächliche Anweisung, die das Array / Objekt in Schlüsselwertpaare aufteilt.
In der Anweisung 'k as v' ist k der Wert und v die Textoption, die dem Benutzer angezeigt wird. Ich denke, "Track by" ist chaotisch und übertrieben.
quelle
Dies war meiner Meinung nach für alle Szenarien am besten geeignet:
Hier können Sie Ihr Modell verwenden, um die Daten zu binden. Sie erhalten den Wert, den das Objekt enthält, und die Standardauswahl basierend auf Ihrem Szenario.
quelle
So habe ich das gelöst. Ich habe die Auswahl nach Wert verfolgt und die Eigenschaft für ausgewählte Elemente in meinem JavaScript-Code auf das Modell festgelegt.
vm
ist mein Controller und das Land im Controller, das vom Dienst abgerufen wurde, ist{CountryId =1, Code = 'USA', CountryName='United States of America'}
.Als ich aus der Auswahl-Dropdown-Liste ein anderes Land ausgewählt und meine Seite mit "Speichern" gepostet habe, wurde das richtige Land gebunden.
quelle
Die
ng-options
Direktive legt das Wertattribut für die<options>
Elemente für Arrays nicht fest:Mit
limit.value as limit.text for limit in limits
Mitteln:Siehe Frage zum Stapelüberlauf AngularJS ng-Optionen, die keine Werte rendern .
quelle
quelle
Sie können ng-options verwenden, um eine Bindung von ausgewählten Tags an Werte zu erreichen und Mitglieder anzuzeigen
Während der Verwendung dieser Datenquelle
Sie können das folgende verwenden, um Ihr Select-Tag an Wert und Name zu binden
es funktioniert super
quelle
Die richtige Antwort auf diese Frage hat der Benutzer frm.adiputra gegeben , da dies derzeit die einzige Möglichkeit zu sein scheint, das Wertattribut der Optionselemente explizit zu steuern.
Ich wollte jedoch nur betonen, dass "select" in diesem Zusammenhang kein Schlüsselwort ist, sondern nur ein Platzhalter für einen Ausdruck. In der folgenden Liste finden Sie die Definition des Ausdrucks "select" sowie anderer Ausdrücke, die in der Direktive ng-options verwendet werden können.
Die Verwendung von select, wie es in der Frage dargestellt ist:
ist im Wesentlichen falsch.
Basierend auf der Liste der Ausdrücke scheint es, dass trackexpr verwendet werden kann, um den Wert anzugeben, wenn Optionen in einem Array von Objekten angegeben werden, dies wurde jedoch nur für die Gruppierung verwendet.
Aus der AngularJS-Dokumentation für ng-Optionen:
quelle
Das Auswählen eines Elements in ng-options kann je nach Einstellung der Datenquelle etwas schwierig sein.
Nachdem ich eine Weile mit ihnen zu kämpfen hatte, machte ich ein Beispiel mit den häufigsten Datenquellen, die ich verwende. Sie finden es hier:
http://plnkr.co/edit/fGq2PM?p=preview
Damit ng-options funktioniert, sind folgende Punkte zu beachten:
key | label
. In vielen Online-Beispielen werden Objekte als 'Schlüssel' angegeben. Wenn Sie Informationen vom Objekt benötigen, legen Sie diese auf diese Weise fest. Andernfalls verwenden Sie die spezifische Eigenschaft, die Sie als Schlüssel benötigen. (ID, CODE usw. Wie im plckr-Beispiel)Die Art und Weise, wie der Wert des Dropdown- / Auswahlsteuerelements eingestellt wird, hängt von # 3 ab.
$scope.dropdownmodel = $scope.user.state;
Wenn Sie das Objekt als Schlüssel festlegen, müssen Sie die Optionen durchlaufen. Selbst wenn Sie das Objekt zuweisen, wird das Element nicht als ausgewählt festgelegt, da es unterschiedliche Hashkeys hat, z.
Sie können savedValue für dieselbe Eigenschaft im anderen Objekt ersetzen
$scope.myObject.myProperty
.quelle
Für mich ist die Antwort von Bruno Gomes die beste Antwort.
Tatsächlich müssen Sie sich jedoch keine Gedanken über das Festlegen der value-Eigenschaft ausgewählter Optionen machen. AngularJS wird sich darum kümmern. Lassen Sie mich im Detail erklären.
Bitte beachten Sie diese Geige
Wie Sie in der Geigenausgabe sehen können, ist es unabhängig von der Auswahl der Auswahlfeldoptionen Ihr benutzerdefinierter Wert oder der von AngularJS automatisch generierte Wert 0, 1, 2, der in Ihrer Ausgabe keine Rolle spielt, es sei denn, Sie verwenden jQuery oder einen anderen andere Bibliothek, um auf den Wert dieser Optionen zuzugreifen, wählen Sie Kombinationsfeldoptionen aus und bearbeiten Sie sie entsprechend.
quelle
Ein Jahr nach der Frage musste ich eine Antwort auf diese Frage finden, da keine von ihnen die eigentliche Antwort gab, zumindest für mich.
Sie haben gefragt, wie die Option ausgewählt werden soll, aber niemand hat gesagt, dass diese beiden Dinge NICHT gleich sind:
Wenn wir eine Option wie diese haben:
Und wir versuchen, eine Standardoption wie diese festzulegen:
Es wird NICHT funktionieren, aber wenn Sie versuchen, die Option wie folgt auszuwählen:
Es wird funktionieren .
Obwohl diese beiden Objekte dieselben Eigenschaften haben, betrachtet AngularJS sie als UNTERSCHIEDLICH, da AngularJS anhand der Referenz vergleicht .
Schauen Sie sich die Geige http://jsfiddle.net/qWzTb/ an .
quelle
Bitte verwenden Sie track by property, um Werte und Beschriftungen im Auswahlfeld zu unterscheiden.
Bitte versuche
Dadurch werden Beschriftungen mit Text und Wert mit Wert (aus dem Array) zugewiesen.
quelle
Für ein Objekt:
quelle
Es ist für Entwickler immer schmerzhaft, mit ng-Optionen zu arbeiten. Beispiel: Abrufen eines leeren / leeren ausgewählten Werts im Auswahl-Tag. Insbesondere beim Umgang mit JSON-Objekten in ng-Optionen wird es langwieriger. Hier habe ich einige Übungen dazu gemacht.
Ziel: Durchlaufen Sie das Array von JSON-Objekten mit der Option ng und setzen Sie das ausgewählte erste Element.
Daten:
Im Auswahl-Tag musste ich xyz und abc anzeigen, wobei xyz ohne großen Aufwand ausgewählt werden muss.
HTML:
Mit dem obigen Codebeispiel könnten Sie aus dieser Übertreibung herauskommen.
Eine weitere Referenz :
quelle
Das Tutorial ANGULAR.JS: NG-SELECT UND NG-OPTIONS hat mir geholfen, das Problem zu lösen:
quelle
quelle
Führen Sie das Code-Snippet aus und sehen Sie sich die Variationen an. Hier ist ein Hinweis zum schnellen Verständnis
Beispiel 1 (Objektauswahl): -
ng-option="os.name for os in osList track by os.id"
. Hiertrack by os.id
ist wichtig & sollte da sein undos.id as
sollte NICHT vorher habenos.name
.ng-model="my_os"
sollte mit Schlüsseln wie auf ein Objekt gesetzt ID wiemy_os={id: 2}
.Beispiel 2 (Wertauswahl): -
ng-option="os.id as os.name for os in osList"
. Hiertrack by os.id
sollte NICHT da sein undos.id as
sollte vorher da seinos.name
.ng-model="my_os"
sollte auf einen Wert wie gesetzt werdenmy_os= 2
Das Restcode-Snippet wird erklärt.
Code-Snippet anzeigen
quelle
Wie viele schon sagten, wenn ich Daten wie diese habe:
Ich würde es verwenden wie:
In Ihrem Controller müssen Sie einen Anfangswert festlegen, um das erste leere Element zu entfernen:
quelle
So löse ich dieses Problem in einer Legacy-Anwendung:
In HTML:
In JavaScript:
...
Mein HTML zeigt den Optionswert richtig an.
quelle
ngOptions-Direktive:
Fall-1) Bezeichnung für Wert im Array:
Erklärung zur Ausgabe (Angenommen, das erste Element wurde ausgewählt):
selectedItem = {name: 'a', age: 20} // [standardmäßig entspricht das ausgewählte Element dem Wert item ]
selectedItem.age = 20
Fall 2) Wählen Sie als Bezeichnung für den Wert im Array:
Erläuterung zur Ausgabe (Angenommen, 1. Element ausgewählt): selectedItem = 20 // [Teil auswählen ist item.age ]
quelle