Oto, co wydaje się niepokoić wielu ludzi (w tym mnie).
Kiedy używam ng-options
dyrektywy w AngularJS do wypełnienia opcji dla <select>
znacznika, nie mogę wymyślić, jak ustawić wartość dla opcji. Dokumentacja tego jest naprawdę niejasna - przynajmniej dla takiego prostaka jak ja.
Mogę łatwo ustawić tekst dla opcji tak:
ng-options="select p.text for p in resultOptions"
Kiedy resultOptions
jest na przykład:
[
{
"value": 1,
"text": "1st"
},
{
"value": 2,
"text": "2nd"
}
]
Powinno być (i prawdopodobnie jest) najprostsze ustawienie wartości opcji, ale jak dotąd nie rozumiem.
javascript
angularjs
Jukka Puranen
źródło
źródło
Odpowiedzi:
W twoim przypadku tak powinno być
Aktualizacja
Dzięki aktualizacjom AngularJS można teraz ustawić rzeczywistą wartość
value
atrybutuselect
elementu ztrack by
wyrażeniem.Jak zapamiętać te brzydkie rzeczy
Wszystkim ludziom, którzy mają trudności z zapamiętaniem tej formy składni: Zgadzam się, że nie jest to najłatwiejsza i najpiękniejsza składnia. Ta składnia jest swego rodzaju rozszerzoną wersją rozumienia list w Pythonie i wiedza, która pomaga mi bardzo łatwo zapamiętać składnię. To jest coś takiego:
Kod Python:
Jest to w rzeczywistości ta sama składnia, co pierwsza wymieniona powyżej. Jednak w
<select>
zwykle musimy rozróżnić rzeczywistą wartość w kodzie i tekst wyświetlany (etykieta) w<select>
elemencie.Potrzebujemy
person.id
kodu, ale nie chcemy pokazywaćid
tego użytkownikowi; chcemy pokazać jego nazwę. Podobnie, nie jesteśmy zainteresowaniperson.name
kodem. Pojawia sięas
słowo kluczowe do oznaczania rzeczy. Więc wygląda to tak:Lub zamiast tego
person.id
potrzebowalibyśmy samejperson
instancji / referencji. Patrz poniżej:W przypadku obiektów JavaScript obowiązuje również ta sama metoda. Pamiętaj tylko, że przedmioty w obiekcie są zdekonstruowane za pomocą
(key, value)
par.źródło
Jak atrybuty wartości uzyskują wartość:
W twoim przypadku powinno to być:
źródło
Też miałem ten problem. Nie byłem w stanie ustawić mojej wartości w opcjach ng. Każda wygenerowana opcja została ustawiona na 0, 1, ..., n.
Aby to zrobić, zrobiłem coś takiego w moich opcjach ng:
HTML:
Korzystam z funkcji „śledź według”, aby ustawić wszystkie moje wartości
room.price
.(Ten przykład jest do kitu: ponieważ gdyby cena była równa więcej niż jednej cenie, kod się nie powiedzie. Upewnij się, że mają różne wartości.)
JSON:
Nauczyłem się tego z postu na blogu Jak ustawić początkową wybraną wartość elementu select za pomocą Angular.JS ng-options i śledzić według .
Obejrzyj wideo. To fajna klasa :)
źródło
Jeśli chcesz zmienić wartość swoich
option
elementów, ponieważ formularz zostanie ostatecznie przesłany na serwer, zamiast tego,Możesz to zrobić:
Oczekiwana wartość zostanie następnie przesłana za pośrednictwem formularza pod prawidłową nazwą.
źródło
<input type="hidden" name="text" value="{{ text }}" />
, używałbymng-value
. Tak:<input type="hidden" name="text" ng-value="{{ text }}" />
.Aby wysłać niestandardową wartość o nazwie
my_hero
na serwer za pomocą zwykłego formularza, prześlij:JSON:
HTML:
Serwer otrzyma albo
iron
albosuper
jako wartośćmy_hero
.Jest to podobne do odpowiedzi @neemzy , ale określa osobne dane dla
value
atrybutu.źródło
Wydaje się, że korzystanie z niego
ng-options
jest skomplikowane (być może frustrujące), ale w rzeczywistości mamy problem z architekturą.AngularJS służy jako środowisko MVC dla dynamicznej aplikacji HTML + JavaScript. Podczas gdy jego komponent (V) iew oferuje szablony HTML, jego głównym celem jest łączenie działań użytkownika za pośrednictwem kontrolera ze zmianami w modelu. Dlatego odpowiedni poziom abstrakcji, z którego można pracować w AngularJS, polega na tym, że element select ustawia wartość w modelu na wartość z zapytania .
ng-options
zapewniafor
słowo kluczowe, które decyduje o tym, jaka powinna być zawartość elementu opcji, tjp.text for p in resultOptions
.ng-options
zapewniaas
słowo kluczowe, aby określić, jaka wartość ma być dostarczana do modelu, jak wk as v for (k,v) in objects
.Prawidłowe rozwiązanie tego problemu ma wówczas charakter architektoniczny i polega na przeredagowaniu kodu HTML, aby (M) odel mógł komunikować się z serwerem w razie potrzeby (zamiast przesyłania formularza przez użytkownika).
Jeśli strona HTML MVC nie jest zbyt wymagająca, aby rozwiązać dany problem: użyj tylko części dotyczącej generowania HTML komponentu iew AngularJS (V). W takim przypadku postępuj zgodnie z tym samym wzorem, który jest używany do generowania elementów takich jak
<li />
„s<ul />
” i umieść powtórzenie ng na elemencie opcji:Jako kludge zawsze można przenieść atrybut nazwy elementu select do ukrytego elementu wejściowego:
źródło
"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."
. Nie ma wzmianki o wydajności, jedynie to, że ngOptions jest alternatywą dla ngRepeat.Możesz to zrobić:
-- AKTUALIZACJA
Po kilku aktualizacjach rozwiązanie frm.adiputra użytkownika jest znacznie lepsze. Kod:
źródło
Dziś zmagam się z tym problemem. Przeczytałem dokumentację AngularJS, to i inne posty oraz kilka blogów, do których prowadzą. Wszystkie pomogły mi uchwycić najdrobniejsze szczegóły, ale ostatecznie wydaje się to dość mylące. Głównie z powodu wielu niuansów składniowych
ng-options
.W końcu dla mnie sprowadza się to do mniej znaczy więcej.
Biorąc pod uwagę zakres skonfigurowany w następujący sposób:
To wszystko, czego potrzebowałem, aby uzyskać pożądany wynik:
Zauważ, że nie korzystałem
track by
. Użycietrack by
wybranego elementu zawsze zwróciłoby obiekt pasujący do FirmnessID, a nie do samego FirmnessID. To teraz spełnia moje kryteria, to znaczy, że powinien zwrócić wartość liczbową zamiast obiektu i użyćng-options
celu uzyskania poprawy wydajności, nie tworzy nowego zakresu dla każdej generowanej opcji.Potrzebowałem też pustego pierwszego wiersza, więc po prostu dodałem znak
<option>
do<select>
elementu.Oto Plunkr, który pokazuje moją pracę.
źródło
Zamiast korzystać z nowej funkcji „śledź według”, możesz po prostu zrobić to z tablicą, jeśli chcesz, aby wartości były takie same jak w tekście:
Zwróć uwagę na różnicę między standardową składnią, która sprawi, że wartości staną się kluczami Object / Array, a zatem 0,1,2 itd. Dla tablicy:
k jak v staje się v jak v .
Odkryłem to w oparciu o zdrowy rozsądek, patrząc na składnię. (k, v) to rzeczywista instrukcja, która dzieli tablicę / obiekt na pary klucz-wartość.
W instrukcji „k as v” k będzie wartością, a v będzie opcją tekstową wyświetlaną użytkownikowi. Myślę, że „śledzenie” jest bałaganiarskie i przesadzone.
źródło
Według mnie najlepiej to pasowało do wszystkich scenariuszy:
gdzie możesz użyć swojego modelu do powiązania danych. Otrzymasz wartość, jak obiekt będzie zawierać, i domyślny wybór na podstawie twojego scenariusza.
źródło
Tak to rozwiązałem. Śledziłem zaznaczenie według wartości i ustawiłem właściwość wybranego elementu na model w moim kodzie JavaScript.
vm
jest moim kontrolerem, a krajem w kontrolerze pobranym z usługi jest{CountryId =1, Code = 'USA', CountryName='United States of America'}
.Kiedy wybrałem inny kraj z menu rozwijanego Wybierz i opublikowałem swoją stronę za pomocą opcji „Zapisz”, zostałem przypisany do właściwego kraju.
źródło
ng-options
Dyrektywa nie określa atrybut wartość na<options>
elementy dla tablic:Za
limit.value as limit.text for limit in limits
pomocą oznacza:Zobacz pytanie Przepełnienie stosu AngularJS ng-opcje nie wyświetla wartości .
źródło
źródło
Możesz użyć opcji ng, aby uzyskać powiązanie znacznika wyboru z wartościami i elementami wyświetlanymi
Podczas korzystania z tego źródła danych
możesz użyć poniżej, aby powiązać swój tag select z wartością i nazwą
działa świetnie
źródło
Prawidłowa odpowiedź na to pytanie została udzielona przez użytkownika frm.adiputra , ponieważ obecnie wydaje się, że jest to jedyny sposób, aby jawnie kontrolować atrybut wartości elementów opcji.
Chciałem jednak tylko podkreślić, że słowo „select” nie jest słowem kluczowym w tym kontekście, ale jest jedynie symbolem zastępczym wyrażenia. Poniższa lista zawiera definicję wyrażenia „select”, a także inne wyrażenia, których można użyć w dyrektywie ng-options.
Zastosowanie select, jak pokazano w pytaniu:
jest zasadniczo błędny.
Na podstawie listy wyrażeń wydaje się, że trackexpr może być użyty do określenia wartości, gdy opcje są podane w tablicy obiektów, ale był używany tylko z grupowaniem.
Z dokumentacji AngularJS dla opcji ng:
źródło
Wybór elementu w opcjach ng może być nieco trudny w zależności od ustawienia źródła danych.
Po dłuższej walce z nimi skończyłem na próbce z najczęściej używanymi źródłami danych. Możesz go znaleźć tutaj:
http://plnkr.co/edit/fGq2PM?p=preview
Teraz, aby opcje ng działały, oto kilka rzeczy do rozważenia:
key | label
. Wiele przykładów online umieszcza obiekty jako „klucz”, a jeśli potrzebujesz informacji z obiektu, ustaw je w ten sposób, w przeciwnym razie użyj określonej właściwości, której potrzebujesz jako klucza. (ID, KOD, itp. Jak w próbce plckr)Sposób ustawienia wartości kontrolki rozwijanej / wyboru zależy od nr 3,
$scope.dropdownmodel = $scope.user.state;
Jeśli ustawisz obiekt jako klucz, musisz przejść przez opcje, nawet przypisanie obiektu nie spowoduje ustawienia elementu jako wybranego, ponieważ będą one miały różne skróty, np .:
Można zastąpić savedValue dla tej samej nieruchomości w innym obiekcie
$scope.myObject.myProperty
.źródło
Dla mnie odpowiedź Bruno Gomesa jest najlepszą odpowiedzią.
Ale tak naprawdę nie musisz się martwić o ustawienie właściwości wartości wybranych opcji. AngularJS zajmie się tym. Pozwól mi wyjaśnić szczegółowo.
Proszę wziąć pod uwagę to skrzypce
Jak widać w skrzypcach, niezależnie od tego, co wybierzesz dla opcji wyboru pola, jest to twoja wartość niestandardowa lub automatycznie generowana wartość 0, 1, 2 przez AngularJS, nie ma to znaczenia w twoim wyniku, chyba że używasz jQuery lub dowolnego inną bibliotekę, aby uzyskać dostęp do wartości wybranych opcji pola kombi i odpowiednio nim manipulować.
źródło
Rok po pytaniu musiałem znaleźć odpowiedź na to pytanie, ponieważ żadne z nich nie dało rzeczywistej odpowiedzi, przynajmniej mi.
Pytałeś, jak wybrać opcję, ale nikt nie powiedział, że te dwie rzeczy NIE są takie same:
Jeśli mamy takie opcje:
Próbujemy ustawić domyślną opcję taką jak ta:
To nie działa, ale jeśli spróbujesz wybrać opcję jak poniżej:
Będzie PRACY .
Mimo że te dwa obiekty mają te same właściwości, AngularJS uważa je za RÓŻNE, ponieważ AngularJS porównuje przez odniesienie .
Spójrz na skrzypce http://jsfiddle.net/qWzTb/ .
źródło
Użyj śledzenia według właściwości, które różnicują wartości i etykiety w polu wyboru.
Proszę spróbować
który przypisze etykiety z tekstem i wartością z wartością (z tablicy)
źródło
Dla obiektu:
źródło
Zawsze jest bolesne dla deweloperów korzystanie z opcji ng. Na przykład: Uzyskiwanie pustej / pustej wybranej wartości w tagu select. Zwłaszcza w przypadku obiektów JSON w opcjach ng staje się bardziej nużący. Tutaj zrobiłem kilka ćwiczeń na ten temat.
Cel: Iteruj tablicę obiektów JSON poprzez opcję ng i ustaw wybrany pierwszy element.
Dane:
W tagu select musiałem pokazać xyz i abc, gdzie xyz należy wybrać bez większego wysiłku.
HTML:
Przez powyższy przykład kodu możesz wyjść z tej przesady.
Kolejne odniesienie :
źródło
Samouczek ANGULAR.JS: NG-SELECT I NG-OPTIONS pomógł mi rozwiązać problem:
źródło
źródło
Uruchom fragment kodu i zobacz odmiany. Oto uwaga dla szybkiego zrozumienia
Przykład 1 (wybór obiektu): -
ng-option="os.name for os in osList track by os.id"
. Tutajtrack by os.id
jest ważna i powinna być tam ios.id as
nie powinny mieć przedos.name
.ng-model="my_os"
Należy ustawić na obiekt z kluczem jako id podobnegomy_os={id: 2}
.Przykład 2 (wybór wartości): -
ng-option="os.id as os.name for os in osList"
. Tutajtrack by os.id
NIE powinno tam być ios.id as
powinno być tam wcześniejos.name
.ng-model="my_os"
Należy ustawić na wartość podobnegomy_os= 2
Fragment kodu odpoczynku wyjaśni.
Pokaż fragment kodu
źródło
Jak wielu powiedziało wcześniej, jeśli mam dane coś takiego:
Użyłbym tego w następujący sposób:
W kontrolerze musisz ustawić wartość początkową, aby pozbyć się pierwszego pustego elementu:
źródło
Oto jak rozwiązuję ten problem w starszej aplikacji:
W HTML:
W JavaScript:
...
Mój HTML wyświetla poprawnie wartość opcji.
źródło
Dyrektywa ngOptions:
Przypadek 1) etykieta wartości w tablicy:
Objaśnienie danych wyjściowych (Załóżmy, że wybrano pierwszy element):
selectedItem = {nazwa: „a”, wiek: 20} // [domyślnie wybrany element jest równy wartościowemu elementowi ]
selectedItem.age = 20
Przypadek 2) wybierz jako etykietę wartości w tablicy:
Dane wyjściowe Objaśnienie (Załóżmy, że wybrano pierwszy element): selectedItem = 20 // [wybierz część to item.age ]
źródło