So haben Sie eine Standardoption im Auswahlfeld von Angular.js

Lesezeit: 8 Minuten

So haben Sie eine Standardoption im Auswahlfeld von Angularjs
iConnor

Ich habe Google durchsucht und kann nichts dazu finden.

Ich habe diesen Code.

<select ng-model="somethingHere" 
        ng-options="option.value as option.name for option in options"
></select>

Mit einigen Daten wie diesen

options = [{
   name: 'Something Cool',
   value: 'something-cool-value'
}, {
   name: 'Something Else',
   value: 'something-else-value'
}];

Und die Ausgabe ist ungefähr so.

<select ng-model="somethingHere"  
        ng-options="option.value as option.name for option in options" 
        class="ng-pristine ng-valid">

    <option value="?" selected="selected"></option>
    <option value="0">Something Cool</option>
    <option value="1">Something Else</option>
</select>

Wie ist es möglich, die erste Option in den Daten als Standardwert festzulegen, damit Sie ein solches Ergebnis erhalten.

<select ng-model="somethingHere" ....>
    <option value="0" selected="selected">Something Cool</option>
    <option value="1">Something Else</option>
</select>

  • Es wäre schön, wenn es eine Antwort gäbe, die nicht davon ausgeht, dass Winkel zum Erstellen der Optionen verwendet wird. Was ist, wenn die Optionen bereits Teil des Markups sind?

    – pspahn

    9. April 2015 um 18:57 Uhr

  • @pspahn – laut docs.angularjs.org/api/ng/directive/ngOptions: nur a **single** hard-coded <option> element ... can be nested into the <select> element. Die Optionen dürfen nicht bereits Teil des Markups sein.

    – Der DIMM-Reaper

    19. August 2015 um 17:31 Uhr


  • @pspahn das würde das OP nicht beantworten, aber eine ganz andere Frage …

    – Mario Truco

    11. August 2016 um 8:30 Uhr

1646351710 379 So haben Sie eine Standardoption im Auswahlfeld von Angularjs
zs2020

Sie können einfach verwenden ng-init so was

<select ng-init="somethingHere = options[0]" 
        ng-model="somethingHere" 
        ng-options="option.name for option in options">
</select>

  • Ich hatte ein Problem mit dieser Funktion, es war, dass ich ‘track by’ benutzte und es entfernte, um das Problem zu beheben, nur für den Fall, dass das jemandem auf der ganzen Linie hilft: D

    – DrCord

    15. April 2014 um 23:21 Uhr

  • An dieser Antwort ist nichts auszusetzen, aber ng-init ist in meinem speziellen Fall für mich fehlgeschlagen. Das Problem war, dass der von mir verwendete Wert zum Zeitpunkt des Ausführens von ng-init noch nicht verfügbar war: Ich habe den Wert über einen Ajax-Aufruf erhalten und in diesem Moment war ng-init bereits fertig. Am Ende habe ich einen Watcher für diesen Wert verwendet und in dieser Funktion dasselbe getan wie in ng-init. Das hat funktioniert.

    – Maurits

    5. September 2014 um 14:02 Uhr

  • Auch ich hatte Probleme, dies zu lösen, @maurits Kommentar führte mich zu diesem stackoverflow.com/questions/22348886 Viel Spaß!

    – Michael

    5. Dezember 2014 um 16:19 Uhr


  • Die Dokumentation von Angular besagt, dass der Controller $scope besser zum Initialisieren dieser Art von Werten verwendet werden sollte docs.angularjs.org/api/ng/directive/ngInit

    – Fortune

    17. März 2015 um 14:01 Uhr


  • Warnung: Die Verwendung von ng-init für diesen Zweck kann zu übermäßigen Aufrufen der $digest()-Methode führen, was dazu führen kann, dass Ihre Konsolenausgabe mit Meldungen wie „10 $digest()-Iterationen erreicht. Abbruch!“ ganz rot und hässlich aussieht.

    – DMac der Zerstörer

    27. April 2015 um 22:27 Uhr

So haben Sie eine Standardoption im Auswahlfeld von Angularjs
Ben Lesh

Wenn Sie sicherstellen möchten, dass Ihre $scope.somethingHere value nicht überschrieben wird, wenn Ihre Ansicht initialisiert wird, sollten Sie zusammenführen (somethingHere = somethingHere || options[0].value) den Wert in Ihrem ng-init wie folgt:

<select ng-model="somethingHere" 
        ng-init="somethingHere = somethingHere || options[0].value"
        ng-options="option.value as option.name for option in options">
</select>

  • Diese Lösung hat gut funktioniert und ist besser als die ausgewählte Antwort.

    – Michael Allan Jackson

    7. März 2014 um 15:16 Uhr

  • sollte ng-init nicht so aussehen ng-init=”somethingHere = somethingHere || options[0]” ??

    – Endlosschleife

    25. Juli 2014 um 15:07 Uhr

  • Wie man damit umgeht options leer sein? Wie im Fall von options Die Daten stammen aus einer externen Quelle.

    – Null

    4. Mai 2015 um 21:11 Uhr

  • @suud Sie müssen nur die Optionen && options.length > 0 in Ihrem ng-init überprüfen. Wirklich, das meiste davon sollte in Ihrem Controller erledigt werden, also ist es testbar.

    – Ben Lesh

    5. Mai 2015 um 17:11 Uhr

  • @BenLesh Wenn ich anstelle der ersten Option einen Text (String) schreiben möchte.ng-init="somethingHere= somethingHere || 'Select one' " Ich habe es so versucht. aber es hat nicht funktioniert. was ist in meinem Code falsch

    – Codelerner

    28. März 2016 um 7:01 Uhr


1646351711 545 So haben Sie eine Standardoption im Auswahlfeld von Angularjs
Michael Benford

Versuche dies:

HTML

<select 
    ng-model="selectedOption" 
    ng-options="option.name for option in options">
</select>

Javascript

function Ctrl($scope) {
    $scope.options = [
        {
          name: 'Something Cool',
          value: 'something-cool-value'
        }, 
        {
          name: 'Something Else',
          value: 'something-else-value'
        }
    ];

    $scope.selectedOption = $scope.options[0];
}

Plunker Hier.

Wenn Sie den Wert, der an das Modell gebunden wird, wirklich festlegen möchten, ändern Sie die ng-options zuschreiben

ng-options="option.value as option.name for option in options"

und das Javascript zu

...
$scope.selectedOption = $scope.options[0].value;

Noch ein Plunker Hier unter Berücksichtigung des oben Gesagten.

  • Das Problem ist, dass ich dies für viele Auswahlfelder tun müsste.

    – iConnor

    12. August 2013 um 19:07 Uhr


  • Habe es nicht verstanden. Was müssten Sie tun?

    – Michael Benford

    12. August 2013 um 19:15 Uhr

  • Ich müsste es vielleicht manuell machen 50+ Kästchen auswählen

    – iConnor

    12. August 2013 um 19:20 Uhr

  • Sie meinen, den Standardwert für jede Auswahlbox festzulegen? Wenn ja, denke ich, dass das in Ihrer Frage nicht klar ist. Wie auch immer, gehe ich richtig in der Annahme, dass Sie die Artikel in jede Auswahlbox laden müssten? Wenn ja, denke ich nicht, dass die Initialisierung ihrer Standardwerte eine große Sache wäre.

    – Michael Benford

    12. August 2013 um 19:46 Uhr


  • Mein Problem ist, dass der Index der Option von einem “Submit” im Formular zurückgegeben wird. Was ich brauche, ist das, was Sie Option.name nennen, was von einem einfachen alten Rails-Formular zurückgegeben wurde. Das Kontrollkästchen und die Optionsfelder funktionieren einwandfrei, da Sie ng-repeat verwenden, um das richtige Markup zu erhalten. Wie erhalte ich die Option „option.name“, die zum Zeitpunkt der Formularübermittlung zurückgegeben wird?

    – pferrel

    4. Januar 2014 um 0:53 Uhr

So haben Sie eine Standardoption im Auswahlfeld von Angularjs
Michail-t

Nur eine Antwort von Srivathsa Harish Venkataramana erwähnt track by das ist in der Tat eine Lösung dafür!

Hier ist ein Beispiel zusammen mit Plunker (Link unten) zur Verwendung track by in auswählen ng-options:

<select ng-model="selectedCity"
        ng-options="city as city.name for city in cities track by city.id">
  <option value="">-- Select City --</option>
</select>

Wenn selectedCity ist auf Winkelbereich definiert, und es hat id Eigenschaft mit dem gleichen Wert wie jede id von irgendwelchen city auf der cities Liste, es wird beim Laden automatisch ausgewählt.

Hier ist Plunker dafür:
http://plnkr.co/edit/1EVs7R20pCffewrG0EmI?p=preview

Siehe Quelldokumentation für weitere Details:
https://code.angularjs.org/1.3.15/docs/api/ng/directive/select

Ich denke, nach der Aufnahme von „track by“ können Sie es in ng-options verwenden, um das zu bekommen, was Sie wollten, wie im Folgenden

 <select ng-model="somethingHere" ng-options="option.name for option in options track by option.value" ></select>

Diese Vorgehensweise ist besser, denn wenn Sie die Liste der Zeichenfolgen durch die Liste der Objekte ersetzen möchten, ändern Sie dies einfach in

 <select ng-model="somethingHere" ng-options="object.name for option in options track by object.id" ></select>

wobei irgendetwasHere natürlich ein Objekt mit den Eigenschaften name und id ist. Bitte beachten Sie, dass ‘as’ nicht auf diese Weise verwendet wird, um die ng-Optionen auszudrücken, da es nur den Wert festlegt und Sie ihn nicht ändern können, wenn Sie track by verwenden

  • Das hat bei mir funktioniert. Ich denke, eckig brauchte etwas, um das Objekt im Modell meines Zielfernrohrs als äquivalent zu einer Auswahl der Referenzliste zu identifizieren. “track by guarantor.code” hat es geschafft!

    – markglatzköpfig

    9. Juni 2014 um 11:00 Uhr

Die akzeptierte Antwort verwenden ng-initaber dokumentieren sagt, ng-init möglichst zu vermeiden.

Die einzig angemessene Verwendung von ngInit ist das Aliasing spezieller Eigenschaften von ngRepeat, wie in der Demo unten zu sehen ist. Abgesehen von diesem Fall sollten Sie Controller anstelle von ngInit verwenden, um Werte in einem Bereich zu initialisieren.

Sie können auch verwenden ng-repeat anstatt ng-options für Ihre Optionen. Mit ng-repeatkönnen Sie verwenden ng-selected mit ng-repeat besondere Eigenschaften. dh $index, $odd, $even, damit dies ohne Codierung funktioniert.

$first ist eine der besonderen Eigenschaften von ng-repeat.

  <select ng-model="foo">
    <option ng-selected="$first" ng-repeat="(id,value) in myOptions" value="{{id}}">
      {{value}}
    </option>
  </select>

———————- BEARBEITEN —————-
Obwohl dies funktioniert, würde ich die Antwort von @mik-t bevorzugen, wenn Sie wissen, welchen Wert Sie auswählen müssen, https://stackoverflow.com/a/29564802/454252, der verwendet wird track-by und ng-options ohne zu benutzen ng-init oder ng-repeat.

Diese Antwort sollte nur verwendet werden, wenn Sie das erste Element auswählen müssen, ohne zu wissen, welchen Wert Sie auswählen müssen. Zum Beispiel verwende ich dies für die automatische Vervollständigung, bei der ständig das ERSTE Element ausgewählt werden muss.

  • Das hat bei mir funktioniert. Ich denke, eckig brauchte etwas, um das Objekt im Modell meines Zielfernrohrs als äquivalent zu einer Auswahl der Referenzliste zu identifizieren. “track by guarantor.code” hat es geschafft!

    – markglatzköpfig

    9. Juni 2014 um 11:00 Uhr

Meine Lösung dafür war die Verwendung von HTML, um meine Standardoption fest zu codieren. So:

In HAML:

%select{'ng-model' => 'province', 'ng-options' => "province as province for province in summary.provinces", 'chosen' => "chosen-select", 'data-placeholder' => "BC & ON"}
  %option{:value => "", :selected => "selected"}
    BC &amp; ON

Im HTML-Format:

<select ng-model="province" ng-options="province as province for province in summary.provinces" chosen="chosen-select" data-placeholder="BC & ON">
  <option value="" selected="selected">BC &amp; ON</option>
</select>

Ich möchte, dass meine Standardoption alle Werte von meiner API zurückgibt, deshalb habe ich einen leeren Wert. Entschuldigen Sie auch meinen Haml. Ich weiß, dass dies keine direkte Antwort auf die Frage des OP ist, aber die Leute finden dies bei Google. Hoffe, das hilft jemand anderem.

  • Ich habe versucht, dies umzuwandeln html aber es ist bei allen Online-Konvertern fehlgeschlagen, die ich ausprobiert habe.

    – iConnor

    13. Mai 2014 um 18:09 Uhr

  • Warum nicht HTML posten? Ich meine, war es wirklich notwendig, den Code so zu posten? Es ist nicht so, als hätte das OP in der Frage eine Vorlagen-Engine verwendet.

    – arg20

    20. Juni 2014 um 1:03 Uhr

928770cookie-checkSo haben Sie eine Standardoption im Auswahlfeld von Angular.js

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

Privacy policy