Czytałem o tym w innych postach, ale nie mogłem tego rozgryźć.
Mam tablicę,
$scope.items = [
{ID: '000001', Title: 'Chicago'},
{ID: '000002', Title: 'New York'},
{ID: '000003', Title: 'Washington'},
];
Chcę to wyrenderować jako:
<select>
<option value="000001">Chicago</option>
<option value="000002">New York</option>
<option value="000003">Washington</option>
</select>
A także chcę wybrać opcję o ID = 000002.
Czytałem select i próbował, ale nie mogę zrozumieć.
javascript
angularjs
html-select
ng-options
Andrej Kaurin
źródło
źródło
Odpowiedzi:
Należy zauważyć, że ngModel jest wymagany do działania ngOptions ... zwróć uwagę na
ng-model="blah"
to, że „ustaw $ scope.blah na wybraną wartość”.Spróbuj tego:
Oto więcej z dokumentacji AngularJS (jeśli jeszcze go nie widziałeś):
W celu wyjaśnienia wartości tagów opcji w AngularJS:
Gdy używasz
ng-options
, wartości tagów opcji wypisanych przez ng-options zawsze będą indeksem elementu tablicy, do którego odnosi się tag opcji . Wynika to z faktu, że AngularJS pozwala na zaznaczanie całych obiektów za pomocą kontrolek wyboru, a nie tylko typów pierwotnych. Na przykład:Powyższe pozwoli ci wybrać
$scope.selectedItem
bezpośrednio cały obiekt . Chodzi o to, że dzięki AngularJS nie musisz się martwić o to, co jest w tagu opcji. Niech AngularJS sobie z tym poradzi; powinieneś dbać tylko o to, co jest w twoim modelu w twoim zakresie.Oto plunker demonstrujący powyższe zachowanie i pokazujący napisany HTML
Postępowanie z opcją domyślną:
Jest kilka rzeczy, o których nie wspomniałem powyżej, odnoszących się do opcji domyślnej.
Wybieranie pierwszej opcji i usuwanie pustej opcji:
Możesz to zrobić, dodając prosty element,
ng-init
który ustawia model (odng-model
) do pierwszego elementu w elementach, w których się powtarzaszng-options
:Uwaga: Może to być trochę szalone, jeśli
foo
zdarzy się, że zostanie poprawnie zainicjowane na coś „falsy”. W takim przypadku będziesz chciał obsłużyć inicjalizacjęfoo
najprawdopodobniej w kontrolerze.Dostosowywanie opcji domyślnej:
To jest trochę inne; tutaj wszystko, co musisz zrobić, to dodać tag opcji jako wybrany element podrzędny z pustym atrybutem wartości, a następnie dostosować jego tekst wewnętrzny:
Uwaga: w tym przypadku opcja „pusta” pozostanie tam nawet po wybraniu innej opcji. Nie dotyczy to domyślnego zachowania selekcji w AngularJS.
Dostosowana domyślna opcja, która ukrywa się po dokonaniu wyboru:
Jeśli chcesz, aby niestandardowa opcja domyślna zniknęła po wybraniu wartości, możesz dodać atrybut ng-hide do opcji domyślnej:
źródło
<option value="?" selected="selected"></option>
)?ng-if="foo"
musiałem użyć,ng-if=!foo
aby ukryć domyślną pustą opcję, gdy wybrana jest inna opcja. Ponadto domyślna pusta opcja pojawia się zawsze na dole listy kombinacji. Jak mogę umieścić to na początku listy kombinacji?Uczę się AngularJS i również zmagałem się z wyborem. Wiem, że na to pytanie już udzielono odpowiedzi, ale mimo to chciałem udostępnić trochę więcej kodu.
W moim teście mam dwie listy: marki samochodów i modele samochodów. Lista modeli jest wyłączona, dopóki nie zostanie wybrana marka. Jeśli wybór w powoduje, że pole listy zostanie później zresetowane (ustawione na „Wybierz markę”), wówczas pole listy modeli zostanie ponownie wyłączone ORAZ jego wybór również zostanie zresetowany (do „Wybierz model”). Sprawia, że są pobierane jako zasób, podczas gdy modele są po prostu zakodowane na stałe.
Sprawia, że JSON:
services.js:
Plik HTML:
kontrolery.js:
źródło
ng-model
powinien wskazywać inną zmienną w twoim zakresie, niezwiązaną zmake
. Zobacz przykład w docs.quarejs.org/api/ng/directive/ngOptionsZ jakiegoś powodu AngularJS pozwala mi się pomylić. Ich dokumentacja jest w tym dość okropna. Przydałoby się więcej dobrych przykładów odmian.
W każdym razie mam niewielkie różnice w odpowiedzi Bena Lesha.
Moje kolekcje danych wyglądają następująco:
Teraz
nadal powodowało, że wartością opcji był indeks (0, 1, 2 itd.).
Dodanie utworu Naprawiono to dla mnie:
Wydaje mi się, że częściej zdarza się, że chcesz dodać tablicę obiektów do listy wyboru, więc zapamiętam ten!
Pamiętaj, że z AngularJS 1.4 nie możesz już używać opcji ng, ale musisz użyć
ng-repeat
tagu opcji:źródło
option
?Odpowiedź na pytanie jest już udzielona (BTW, naprawdę dobra i wyczerpująca odpowiedź udzielona przez Bena), ale chciałbym dodać kolejny element kompletności, który może być również bardzo przydatny.
W przykładzie zasugerowanym przez Bena:
wymienionym poniżej ngOptions forma została wykorzystana:
select as label for value in array
.Etykieta jest wyrażeniem, którego wynikiem będzie etykieta
<option>
elementu. W takim przypadku możesz wykonać określone konkatenacje ciągów, aby uzyskać bardziej złożone etykiety opcji.Przykłady:
ng-options="item.ID as item.Title + ' - ' + item.ID for item in items"
daje etykiety jakTitle - ID
ng-options="item.ID as item.Title + ' (' + item.Title.length + ')' for item in items"
daje etykiety takie jakTitle (X)
, gdzieX
jest długość ciągu tytułu.Możesz także użyć filtrów, na przykład
ng-options="item.ID as item.Title + ' (' + (item.Title | uppercase) + ')' for item in items"
daje etykiety jakTitle (TITLE)
, gdzie wartość tytułu właściwości tytułu i TYTUŁU jest taka sama, ale jest konwertowana na wielkie litery.ng-options="item.ID as item.Title + ' (' + (item.SomeDate | date) + ')' for item in items"
daje etykiety, np.Title (27 Sep 2015)
jeśli twój model ma właściwośćSomeDate
źródło
W CoffeeScript:
źródło
radix
oparseInt
: http://davidwalsh.name/parseint-radixJeśli potrzebujesz niestandardowego tytułu dla każdej opcji,
ng-options
nie dotyczy. Zamiast tego użyjng-repeat
z opcjami:źródło
Mam nadzieję, że następujące działania będą dla Ciebie działać.
źródło
To może być przydatne. Wiązania nie zawsze działają.
Na przykład wypełniasz model źródłowy listy opcji z usługi REST. Wybrana wartość była znana przed wypełnieniem listy i została ustawiona. Po wykonaniu żądania REST za pomocą $ http opcja listy jest wykonywana.
Ale wybrana opcja nie jest ustawiona. Z nieznanych powodów wykonanie AngularJS w cieniu $ digest nie wiąże wybranego tak, jak powinno. Muszę użyć jQuery, aby ustawić wybrane. To ważne! AngularJS, w cieniu, dodaje przedrostek do wartości „wartości” attr dla opcji generowanych przez ng-repeat. Dla int jest to „liczba:”.
źródło