Chcę użyć przycisku opcji w formularzu używającym Angular 2
Options : <br/>
1 : <input name="options" ng-control="options" type="radio" value="1" [(ng-model)]="model.options" ><br/>
2 : <input name="options" ng-control="options" type="radio" value="2" [(ng-model)]="model.options" ><br/>
wartość początkowa model.options to 1
kiedy strona jest ładowana, pierwszy przycisk opcji nie jest zaznaczony, a modyfikacje nie są powiązane z modelem
Dowolny pomysł ?
forms
radio-button
angular
Mourad Zouabi
źródło
źródło
Odpowiedzi:
użyj [value] = „1” zamiast value = „1”
Edytować:
Zgodnie z sugestią thllbrg „W przypadku kątowego 2.1+ użyj
[(ngModel)]
zamiast[(ng-model)]
”źródło
[(ngModel)]
zamiast[(ng-model)]
. Przeczytaj jeszcze raz .value="1" [(ngModel)]="model.options"
. Ujęcievalue
w nawiasach kwadratowych nie działałoUwaga - powiązanie przycisku radiowego jest teraz obsługiwaną funkcją w RC4 i nowszych - zobacz tę odpowiedź
Przykład przycisku radiowego używającego niestandardowego RadioControlValueAccessor podobnego do CheckboxControlValueAccessor ( zaktualizowany za pomocą Angular 2 rc-1 )
App.ts
template.html
radio_value_accessor.ts
Źródło: https://github.com/angular2-school/angular2-radio-button
Demo na żywo Plunker: http://plnkr.co/edit/aggee6An1iHfwsqGoE3q?p=preview
źródło
this._renderer.setElementProperty(this._elementRef.nativeElement, 'checked', value == this._elementRef.nativeElement.value);
Moje ręczne obejście, które polega na ręcznej aktualizacji
model.options
po wybraniu nowego przycisku opcji:To Plunkerdemonstruje powyższe, a także sposób użycia przycisku do zmiany wybranego przycisku opcji - tj. W celu udowodnienia, że powiązanie danych jest dwukierunkowe:
źródło
get debug()
funkcji, coget
oznacza? po drugie: czy jest jakaś alternatywa podobna do tej odpowiedzi dla pól wyboru? proszę podać również kod dla pól wyboru. dzięki +1 za świetną odpowiedź.get
jest funkcją dostępu TypeScript . Zadaj pytanie dla pól wyboru.Anotherdate('2015-05-18T02:30:56')
nie zadziała. Settery są wywoływane, gdy próbujesz przypisać wartość do właściwości. W moim plunkerze utworzyłemsetDate()
funkcję, aby \ hat przyjmował nową wartość daty, którą następnie przypisujeAnotherdate
. To przypisanie automatycznie wywoła ustawiającego.{{}}
powiązania są ponownie oceniane w każdym cyklu wykrywania zmian. ZaimplementowałemngDoCheck()
w AppComponent w plunkrze, aby zliczać cykle wykrywania zmian. Z tego widać, że wykrywanie zmian jest wywoływane 3 razy. W trybie deweloperskim powiązania są sprawdzane dwukrotnie , stąd 6 razy.Oto najlepszy sposób korzystania z przycisków opcji w Angular2. Nie ma potrzeby używania zdarzenia (click) lub RadioControlValueAccessor do zmiany powiązanej wartości właściwości, ustawienie właściwości [check] załatwia sprawę.
Opublikowałem przykład użycia przycisków radiowych: Angular 2: jak utworzyć przyciski radiowe z wyliczenia i dodać dwukierunkowe wiązanie? Działa od co najmniej Angular 2 RC5.
źródło
Ten problem został rozwiązany w wersji Angular 2.0.0-rc.4, odpowiednio w formularzach.
Uwzględnij
"@angular/forms": "0.2.0"
w pliku package.json.Następnie rozszerz bootstrap w main. Odpowiednia część:
Mam to w .html i działa idealnie: wartość: {{buildTool}}
źródło
disableDeprecatedForms
iprovideForms
wygląda magiczne i nie ma sensu. Co to robi? Jest to nadmiarowy, nieczytelny kod, który tworzy nieprzewidywalne rzeczy o nieznanej skali.Szukałem odpowiedniej metody obsługi tych przycisków radiowych, tutaj jest przykład rozwiązania, które znalazłem tutaj:
Zwróć uwagę na onSelectionChange, który przekazuje bieżący element do metody.
źródło
Wydaje się, że wejście radiowe nie jest jeszcze obsługiwane. Nie powinno być wprowadzona wartość radiowy accessor (podobna do CheckBox w jednym , gdzie ustawia „sprawdzone” attr tutaj ), ale nie znaleźliśmy żadnych. Więc wdrożyłem jeden; możesz to sprawdzić tutaj .
źródło
[value] = "item" przy użyciu * ngFor działa również z Reactive Forms w Angular 2 i 4
źródło
Poniższe rozwiązania rozwiązały mój problem, rozważ dodanie wejścia radiowego do
form
tagu i użycie[value]
tagu do wyświetlenia wartości.źródło
Oto rozwiązanie, które działa dla mnie. Obejmuje powiązanie przycisku opcji - ale nie powiązanie z danymi biznesowymi, ale zamiast tego powiązanie ze stanem przycisku opcji. Prawdopodobnie NIE jest to najlepsze rozwiązanie dla nowych projektów, ale jest odpowiednie dla mojego projektu. Mój projekt zawiera mnóstwo istniejącego kodu napisanego w innej technologii, którą przenoszę do Angulara. Stary kod podąża za wzorcem, w którym kod jest bardzo zainteresowany sprawdzeniem każdego przycisku radiowego, aby sprawdzić, czy jest on wybrany. Rozwiązanie to jest odmianą rozwiązań obsługi kliknięć, z których niektóre zostały już wspomniane w Stack Overflow. Wartością dodaną tego rozwiązania może być:
To rozwiązanie obejmuje
Przykład:
...
...
Gdy użytkownik kliknie przycisk opcji, zostanie wywołana metoda selectButton klasy pomocniczej. Jest przekazywany model przycisku radiowego, który został kliknięty. Klasa pomocnicza ustawia pole logiczne „wybrane” przekazanego modelu na wartość true, a pole „wybrane” wszystkich innych modeli przycisków opcji ustawia na wartość fałsz.
Podczas inicjalizacji komponent musi skonstruować instancję klasy pomocniczej z listą wszystkich modeli przycisków opcji w grupie. W tym przykładzie „radioButtonGroupList” byłoby instancją klasy pomocniczej, której kod to:
źródło
Przykład listy radia Angular 8:
Link do źródła
Odpowiedź JSON
Szablon HTML
źródło
Najprostsze rozwiązanie i obejście:
źródło
Utworzyłem wersję, używając tylko zdarzenia click na załadowanych elementach i przekazując wartość zaznaczenia do funkcji "getSelection" i aktualizując model.
W Twoim szablonie:
Twoja klasa:
Zobacz przykład: https://plnkr.co/edit/2Muje8yvWZVL9OXqG0pW?p=info
źródło
O ile ta odpowiedź może nie być najlepsza w zależności od twojego przypadku użycia, działa. Zamiast używać przycisku Radio dla wyboru mężczyzny i kobiety, używanie
<select> </select>
działa doskonale, zarówno do zapisywania, jak i edycji.Powyższe powinno wystarczyć do edycji przy użyciu FormGroup z
patchValue
. Do tworzenia możesz użyć[(ngModel)]
zamiastformControlName
. Nadal działa.Prace hydrauliczne związane z pierwszym przyciskiem radiowym, zdecydowałem się zamiast tego wybrać. Wizualnie i pod względem UX nie wydaje się być najlepszy, ale z punktu widzenia programisty jest o wiele łatwiejszy.
źródło
Włącz Zmień przycisk radiowy, pobierz wartość odpowiednich przycisków z tymi liniami
https://stackblitz.com/edit/angular-jpo2dm?embed=1&file=src/app/app.component.html
źródło
Oto kod, którego używam, który działa z Angular 7
(Uwaga: w przeszłości czasami korzystałem z informacji dostarczonych przez odpowiedź Anthony'ego Brenelière'a, które doceniam. Ale przynajmniej w przypadku Angular 7 ta część:
Okazało się, że jest to niepotrzebne.)
Moje rozwiązanie ma trzy zalety:
Przykładowy kod HTML:
Przykład TypeScript:
Używane są dwie klasy:
Klasa grupy przycisków opcji:
Klasa przycisku opcji
źródło
Może to nie jest właściwe rozwiązanie, ale jest to również opcja, mam nadzieję, że komuś pomoże.
Do tej pory otrzymywałem wartość radioButtons metodą (kliknięcie) w następujący sposób:
aw pliku .ts ustawiłem wartość predefiniowanej zmiennej na wartość
onChange
funkcji pobierającej .Ale po wyszukiwaniu znalazłem dobrą metodę, której jeszcze nie wypróbowałem, ale wydaje się, że ta jest dobra, używając
[(ng-model)]
linku tutaj do github tutaj . to jest używaneRadioControlValueAccessor
dla radia, a także pole wyboru. tutaj jest praca # plnkr # dla tej metody tutaj .źródło