ng-options con semplice array init


187

Sono un po 'confuso con Angular e ng-options.

Ho un array semplice e voglio iniziare una selezione con esso. Ma voglio che le opzioni valore = etichetta.

script.js

$scope.options = ['var1', 'var2', 'var3'];

html

<select ng-model="myselect" ng-options="o for o in options"></select>

Cosa ottengo:

<option value="0">var1</option>
<option value="1">var2</option>
<option value="2">var3</option>

Quello che voglio:

<option value="var1">var1</option>
<option value="var2">var2</option>
<option value="var3">var3</option>

Quindi ho provato:

<select ng-model="myselect2" ng-init=0 ng-options="options[k] as v for (k,v) in options"></select>

<select ng-model="myselect3" ng-init=0 ng-options="b as b for b in options"></select>

(Ma non ha funzionato.)

Modificare:

Il mio modulo è inviato esternamente, motivo per cui ho bisogno di 'var1' come valore anziché 0.

Risposte:


304

In realtà hai avuto ragione nel tuo terzo tentativo.

 <select ng-model="myselect" ng-options="o as o for o in options"></select>

Guarda un esempio funzionante qui: http://plnkr.co/edit/xEERH2zDQ5mPXt9qCl6k?p=preview

Il trucco è che AngularJS scrive i tasti come numeri da 0 a n e li traduce all'indietro durante l'aggiornamento del modello.

Di conseguenza, l'HTML apparirà errato ma il modello verrà comunque impostato correttamente quando si sceglie un valore. (ad esempio AngularJS tradurrà '0' in 'var1')

Anche la soluzione di Epokk funziona, tuttavia se si caricano i dati in modo asincrono si potrebbe scoprire che non si aggiorna sempre correttamente. L'uso di ngOptions si aggiorna correttamente quando l'ambito cambia.


1
Sei fuori tema. Non hai capito le istruzioni. Vuole valuenel suo select.
EpokK,

10
Ho compreso le istruzioni, tuttavia è molto probabile che il suo intento sia quello di associare il "valore" al modello, e fraintende ciò che sta accadendo a causa del modo in cui AngularJs sta eseguendo il rendering del tag.
James Davies,

3
Funziona se ottieni il valore di select con angolare, ma nel mio caso (cioè il classico modulo di invio), i valori saranno 0,1,2,3, non var1, var2, var3
Dragu

1
Supponevo che fossi vincolante per il modello, ma se stai semplicemente utilizzando AngularJS per rendere un modulo inviato esternamente ad angolare, usa la soluzione di EpokK.
James Davies,

66
Sono solo io, o è questa la sintassi più complicata e poco chiara di sempre?
fool4jesus,

35

È possibile utilizzare ng-repeatcon optionquesto modo:

<form>
    <select ng-model="yourSelect" 
        ng-options="option as option for option in ['var1', 'var2', 'var3']"
        ng-init="yourSelect='var1'"></select>
    <input type="hidden" name="yourSelect" value="{{yourSelect}}" />
</form>

Quando invii il formtuo puoi ottenere nascosto il valore dell'input.


DEMO

ng-selezionato ng-repeat


Se hai sminuito la mia risposta, controlla la mia nuova soluzione.
EpokK,

21

potresti usare qualcosa del genere

<select ng-model="myselect">
    <option ng-repeat="o in options" ng-selected="{{o==myselect}}" value="{{o}}">
        {{o}}
    </option>
</select>

usando ng-selected si preseleziona l'opzione nel caso in cui myselect fosse precompilata.

Preferisco questo metodo piuttosto che ng-options, poiché ng-options funziona solo con le matrici. ng-repeat funziona anche con oggetti simili a json.


1
ng-optionsfunziona anche con origini dati oggetto. Vedi docs.angularjs.org/api/ng/directive/select
Charlie Schliesser,

1
Sebbene altri abbiano dato delle soluzioni alternative, questa soluzione è di gran lunga il più elegante e vicino al vecchio stile html, funziona sia con la rilegatura angolare del modello sia con la forma sottomittente. Grazie!
Fadi Chamieh,

4
ng-selected non ha bisogno del manubrio poiché è una direttiva angolare. Soluzione eccellente
Kasey Speakman,

20

Se si imposta la selezione come segue:

<select ng-model="myselect" ng-options="b for b in options track by b"></select>

otterrete:

<option value="var1">var1</option>
<option value="var2">var2</option>
<option value="var3">var3</option>

violino di lavoro: http://jsfiddle.net/x8kCZ/15/


1
Questa soluzione è stata l'unica che ha funzionato per me per selezionare il valore iniziale in una matrice di stringhe.
Ena,

sì, questa dovrebbe essere la risposta, la traccia fa la magia per me.
Gurnard,

mi aspettavo almeno dopo aver seguito le soluzioni di cui sopra, ma questa era la via d'uscita facile
sac Dahal,

10
<select ng-model="option" ng-options="o for o in options">

$ scope.option sarà uguale a 'var1' dopo la modifica, anche tu vedi value = "0" nell'html generato

plunker

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.