Wie setze ich die value-Eigenschaft in den ng-Optionen von AngularJS?

Lesezeit: 10 Minuten

Wie setze ich die value Eigenschaft in den ng Optionen von AngularJS
Jukka Puranen

Hier ist, was viele Leute (mich eingeschlossen) zu stören scheint.

Bei Verwendung der ng-options Direktive in AngularJS zum Ausfüllen der Optionen für a <select> Tag kann ich nicht herausfinden, wie ich den Wert für eine Option festlegen kann. Die Dokumentation dazu ist wirklich unklar – zumindest für einen Einfaltspinsel wie mich.

Ich kann den Text für eine Option einfach so setzen:

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 es wahrscheinlich) die einfachste Sache sein, die Optionswerte zu setzen, aber bisher verstehe ich es einfach nicht.

  • Hatte das gleiche Problem, weil ich die Dokumente (wie unten gezeigt) nicht sehr klar fand.

    – benvds

    13. November 2012 um 16:32 Uhr

  • Die in der Frage dargestellte Verwendung von „select“ ist grundsätzlich falsch, da „select“ in diesem Zusammenhang kein Schlüsselwort, sondern ein Platzhalter für einen Ausdruck ist. Dies ist aus der Dokumentation von AngularJS: “select: Das Ergebnis dieses Ausdrucks wird an das Modell des übergeordneten Elements gebunden. Wenn nicht angegeben, wird der Auswahlausdruck standardmäßig auf den Wert gesetzt.” Ich habe in meiner Antwort unten weitere Einzelheiten angegeben.

    – Majix

    5. Mai 2014 um 15:18 Uhr

  • Für mich ist das die beste Antwort. stackoverflow.com/questions/12139152/…

    – Sanjay

    12. März 2015 um 9:10 Uhr

  • Hinweis: Damit ng-Optionen funktionieren, ist ng-model obligatorisch!!!!!!!!! Siehe: stackoverflow.com/a/13049740/234110

    – Anand Rockzz

    5. April 2015 um 14:17 Uhr


  • stackoverflow.com/questions/18615624/…

    – Xalisys

    4. Mai 2016 um 18:31 Uhr

1646262311 40 Wie setze ich die value Eigenschaft in den ng Optionen von AngularJS
Umur Kontaci

Sehen ngOptionen

ngOptionen (optional) – {comprehension_expression=} – in einer der folgenden Formen:

Für Array-Datenquellen:
label for value in array
select as label for value in array
label group by group for value in array
select as label group by group for value in array track by trackexpr
Für Objektdatenquellen:
label for (key , value) in object
select as label for (key , value) in object
label group by group for (key, value) in object
select as label group by group for (key, value) in object

In deinem Fall sollte es so sein

array = [{ "value": 1, "text": "1st" }, { "value": 2, "text": "2nd" }];

<select ng-options="obj.value as obj.text for obj in array"></select>

Aktualisieren

Mit den Updates auf AngularJS ist es nun möglich, den tatsächlichen Wert für die value Attribut von select Element mit track by Ausdruck.

<select ng-options="obj.text for obj in array track by obj.value">
</select>

Wie man sich an dieses hässliche Zeug erinnert

An alle Leute, die Schwierigkeiten 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 wenn ich das weiß, kann ich mir die Syntax sehr leicht merken. Es ist ungefähr so:

Python-Code:

my_list = [x**2 for x in [1, 2, 3, 4, 5]]
> [1, 4, 9, 16, 25]

# Let people to be a list of person instances
my_list2 = [person.name for person in people]
> my_list2 = ['Alice', 'Bob']

Dies ist tatsächlich die gleiche Syntax wie die erste oben aufgeführte. Allerdings hinein <select> Normalerweise müssen wir zwischen dem tatsächlichen Wert in Code und dem angezeigten Text (dem Label) in a unterscheiden <select> Element.

Wie, wir brauchen person.id im Code, aber wir wollen das nicht zeigen id an den Benutzer; Wir wollen seinen Namen zeigen. Ebenso interessieren uns die nicht person.name im Code. Da kommt die as Schlüsselwort, um Dinge zu kennzeichnen. Also wird es so:

person.id as person.name for person in people

Oder statt person.id wir könnten die brauchen person Instanz/Referenz selbst. Siehe unten:

person as person.name for person in people

Für JavaScript-Objekte gilt die gleiche Methode ebenfalls. Denken Sie nur daran, dass die Gegenstände im Objekt mit dekonstruiert werden (key, value) Paare.

  • Ihr Beispiel füllt das Wertattribut der Option nicht aus. Es definiert, was im Modell des , sodass die Datenliste die Optionen über ihren Wert referenzieren kann. Danke @Bruno Gomes

    – Kletteroid

    7. Mai 2014 um 15:57 Uhr

  • das ist die einzige lösung die bei mir funktioniert. Danke.

    – Neuner

    14. Mai 2014 um 15:35 Uhr

  • Dies ist das passendste Antwort für die ng-Optionen mit dem Wert des Optionsfelds, um mit dem Array/Objekt übereinzustimmen. hätte ich gegeben 10000 Punkte für Sie dafür, dass Sie allen den Tag gerettet haben, wenn es ein Prämientauschsystem gibt. Bizarrste Syntax von Angle Team.

    – Webblover

    11. Juli 2014 um 6:36 Uhr


  • DANKE! Das war lange Zeit so frustrierend!

    – SeanThompson

    30. Juli 2014 um 22:39 Uhr

  • Ich hoffe die Zimmerpreise sind nie gleich, denn dann bricht diese ein.

    – nilskp

    7. September 2014 um 22:24 Uhr

1646262313 472 Wie setze ich die value Eigenschaft in den ng Optionen von AngularJS
neemzy

Wenn Sie den Wert Ihrer ändern möchten option Elemente, da das Formular schließlich an den Server gesendet wird, anstatt dies zu tun,

<select name="text" ng-model="text" ng-options="select p.text for p in resultOptions"></select>

Du kannst das:

<select ng-model="text" ng-options="select p.text for p in resultOptions"></select>
<input type="hidden" name="text" value="{{ text }}" />

Der erwartete Wert wird dann unter dem richtigen Namen durch das Formular gesendet.

AngularJS andert URLs auf der Erweiterungsseite in „unsafe
Philipp Bulley

Um einen benutzerdefinierten Wert zu senden, wird aufgerufen my_hero an den Server mit einem normalen Formular senden:

JSON:

"heroes": [
  {"id":"iron", "label":"Iron Man Rocks!"},
  {"id":"super", "label":"Superman Rocks!"}
]

HTML:

<select ng-model="hero" ng-options="obj.id as obj.label for obj in heroes"></select>
<input type="hidden" name="my_hero" value="{{hero}}" />

Der Server empfängt entweder iron oder super als Wert von my_hero.

Dies ähnelt der Antwort von @neemzy, wobei jedoch separate Daten für die angegeben werden value Attribut.

1646262313 864 Wie setze ich die value Eigenschaft in den ng Optionen von AngularJS
Peter Mortensen

Anscheinend ng-options ist kompliziert (möglicherweise frustrierend) zu verwenden, aber in Wirklichkeit haben wir ein Architekturproblem.

AngularJS dient als MVC-Framework für eine dynamische HTML+JavaScript-Anwendung. Während seine (View)-Komponente HTML-“Vorlagen” bietet, besteht sein Hauptzweck darin, Benutzeraktionen über einen Controller mit Änderungen im Modell zu verbinden. Deswegen Die geeignete Abstraktionsebene, von der aus in AngularJS gearbeitet werden kann, besteht darin, dass ein Auswahlelement einen Wert im Modell auf einen Wert aus einer Abfrage setzt.

  • Wie eine Abfragezeile dem Benutzer präsentiert wird, ist das Anliegen der (Ansicht) und ng-options bietet die for -Schlüsselwort, um festzulegen, was der Inhalt des Optionselements sein soll dh p.text for p in resultOptions.
  • Wie eine ausgewählte Zeile dem Server präsentiert wird, ist die Angelegenheit des (M)odels. Deswegen ng-options bietet die as Schlüsselwort, um anzugeben, welcher Wert dem Modell wie in bereitgestellt wird k as v for (k,v) in objects.

Die richtige Lösung dieses Problems ist dann architektonischer Natur und beinhaltet das Refactoring Ihres HTML, sodass das (M)odel bei Bedarf die Serverkommunikation durchführt (anstatt dass der Benutzer ein Formular absendet).

Wenn eine MVC-HTML-Seite unnötiges Over-Engineering für das vorliegende Problem ist: Verwenden Sie dann nur den HTML-Generierungsteil der (V)View-Komponente von AngularJS. Folgen Sie in diesem Fall dem gleichen Muster, das zum Generieren von Elementen wie verwendet wird &lt;li /&gt;ist unter &lt;ul /&gt;‘s und platzieren Sie eine ng-Wiederholung auf einem Optionselement:

<select name=“value”>
    <option ng-repeat=“value in Model.Values” value=“{{value.value}}”>
        {{value.text}}
    </option>
</select>

Als klumpenkann man das name-Attribut des select-Elements immer in ein verstecktes input-Element verschieben:

<select ng-model=“selectedValue” ng-options=“value.text for value in Model.Values”>
</select>
<input type=“hidden” name=“value” value=“{{selectedValue}}” />

1646262314 265 Wie setze ich die value Eigenschaft in den ng Optionen von AngularJS
Gemeinschaft

Du kannst das:

<select ng-model="model">
    <option value="">Select</option>
    <option ng-repeat="obj in array" value="{{obj.id}}">{{obj.name}}</option>
</select>

— AKTUALISIEREN

Nach einigen Updates, user frm.adiputraDie Lösung von ist viel besser. Code:

obj = { '1': '1st', '2': '2nd' };
<select ng-options="k as v for (k,v) in obj"></select>

  • Es ist besser, ng-options innerhalb des select-Elements/der select-Direktive zu verwenden. Beispiel:

    917070cookie-checkWie setze ich die value-Eigenschaft in den ng-Optionen von AngularJS?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy