Mam kilka pól wyboru:
<input type='checkbox' value="apple" checked>
<input type='checkbox' value="orange">
<input type='checkbox' value="pear" checked>
<input type='checkbox' value="naartjie">
Chciałbym powiązać z listą w moim kontrolerze, tak że przy każdej zmianie pola wyboru kontroler zachowuje listę wszystkich sprawdzonych wartości, na przykład ['apple', 'pear']
.
model ng wydaje się być w stanie powiązać wartość tylko jednego pola wyboru ze zmienną w kontrolerze.
Czy istnieje inny sposób, aby to zrobić, aby powiązać cztery pola wyboru z listą w kontrolerze?
javascript
angularjs
nickponline
źródło
źródło
<input type='checkbox' ng-model="checkboxes.apple">
itd. Model mógłby wyglądać następująco: {„jabłko”: prawda, „pomarańcza”: fałsz, „gruszka”: prawda, „naartjie”: prawda}naartjie
!? To tylko rozdaje boet! : DOdpowiedzi:
Istnieją dwa sposoby rozwiązania tego problemu. Albo użyj prostej tablicy, albo tablicy obiektów. Każde rozwiązanie ma swoje zalety i wady. Poniżej znajdziesz jeden dla każdego przypadku.
Z prostą tablicą jako danymi wejściowymi
HTML może wyglądać następująco:
Odpowiedni kod kontrolera to:
Plusy : prosta struktura danych i przełączanie według nazwy jest łatwe w obsłudze
Wady : dodawanie / usuwanie jest uciążliwe, ponieważ dwie listy (wejście i wybór) muszą być zarządzane
Z tablicą obiektów jako danymi wejściowymi
HTML może wyglądać następująco:
Odpowiedni kod kontrolera to:
Plusy : Dodaj / usuń jest bardzo łatwe
Wady : Nieco bardziej złożona struktura danych i przełączanie według nazwy jest uciążliwe lub wymaga metody pomocniczej
Demo : http://jsbin.com/ImAqUC/1/
źródło
value="{{fruit.name}}"
ing-checked="fruit.checked"
są zbędne, ponieważ używany jest model ng.Proste rozwiązanie:
http://plnkr.co/edit/U4VD61?p=preview
źródło
(color,enabled) in colors
?colors
jest obiektem, gdy go iterujesz - dostajesz pary(key,value)
.colors
należy nazwaćisSelected
, jest o wiele łatwiejszy do odczytaniaisSelected[color]
niżcolors[color]
.
źródło
Oto krótka, krótka dyrektywa wielokrotnego użytku, która wydaje się robić to, czego chcesz. Po prostu to nazwałem
checkList
. Aktualizuje tablicę, gdy zmieniają się pola wyboru, i aktualizuje pola wyboru, gdy zmienia się tablica.Oto kontroler i widok, który pokazuje, jak możesz z niego korzystać.
(Przyciski pokazują, że zmiana tablicy spowoduje również aktualizację pól wyboru).
Wreszcie, oto przykład dyrektywy działającej na Plunker: http://plnkr.co/edit/3YNLsyoG4PIBW6Kj7dRK?p=preview
źródło
value: '@'
navalue: '=ngValue'
Na podstawie odpowiedzi w tym wątku stworzyłem dyrektywę modelową listę kontrolną, która obejmuje wszystkie przypadki:
W przypadku tematu początkowego byłoby to:
źródło
selectedFruits
.Użycie ciągu
$index
może pomóc w użyciu skrótu wybranych wartości:W ten sposób obiekt modelu ng jest aktualizowany kluczem reprezentującym indeks.
Po chwili
$scope.someObject
powinno wyglądać mniej więcej tak:Ta metoda nie działa we wszystkich sytuacjach, ale jest łatwa do wdrożenia.
źródło
Ponieważ zaakceptowałeś odpowiedź, w której nie użyto listy, przyjmuję odpowiedź na moje pytanie w komentarzu brzmi: „Nie, to nie musi być lista”. Miałem też wrażenie, że może renderowałeś stronę serwera HTML, ponieważ „sample” jest obecne w twoim przykładowym HTMLu (nie byłoby to konieczne, gdyby do modelowania twoich pól wyboru użyto ng-model).
W każdym razie oto, co miałem na myśli, zadając pytanie, zakładając również, że generujesz stronę HTML po stronie serwera:
ng-init pozwala HTMLowi wygenerowanemu po stronie serwera ustawić początkowo pewne pola wyboru.
Fiddle .
źródło
Myślę, że najłatwiejszym obejściem byłoby użycie opcji „wybierz” z określoną „wielokrotnością”:
W przeciwnym razie myślę, że będziesz musiał przetworzyć listę, aby ją zbudować (
$watch()
łącząc tablicę modeli z polami wyboru).źródło
Dostosowałem zaakceptowaną odpowiedź Yoshi do obsługi złożonych obiektów (zamiast łańcuchów).
HTML
JavaScript
Przykład roboczy: http://jsfiddle.net/tCU8v/
źródło
<input type="checkbox">
bez opakowania lub dopasowania<label>
! Teraz użytkownicy muszą kliknąć rzeczywiste pole wyboru zamiast tekstu obok pola wyboru, co jest o wiele trudniejsze i ma złą użyteczność.Inna prosta dyrektywa może wyglądać następująco:
Kontroler:
I HTML:
Dołączam również plunkera: http://plnkr.co/edit/XnFtyij4ed6RyFwnFN6V?p=preview
źródło
Poniższe rozwiązanie wydaje się dobrą opcją,
W modelu kontrolera wartość
fruits
będzie takaźródło
Nie musisz pisać całego tego kodu. AngularJS utrzyma synchronizację modelu i pól wyboru po prostu za pomocą ngTrueValue i ngFalseValue
Codepen tutaj: http://codepen.io/paulbhartzog/pen/kBhzn
Fragment kodu:
źródło
Sprawdź tę dyrektywę, która skutecznie zarządza listami pól wyboru. Mam nadzieję, że to zadziała dla ciebie. Model listy kontrolnej
źródło
Istnieje sposób na bezpośrednią pracę na macierzy i jednoczesne używanie modelu ng
ng-model-options="{ getterSetter: true }"
.Sztuką jest użycie funkcji getter / setter w swoim modelu ng. W ten sposób możesz użyć tablicy jako prawdziwego modelu i „sfałszować” logiczne wartości w modelu wejściowym:
CAVEAT Nie powinieneś używać tej metody, jeśli twoje tablice są duże, jak
myGetterSetter
to będzie nazywane wiele razy.Więcej informacji na ten temat można znaleźć na stronie https://docs.angularjs.org/api/ng/directive/ngModelOptions .
źródło
Podoba mi się odpowiedź Yoshi. Udoskonaliłem go, aby można było używać tej samej funkcji do wielu list.
http://plnkr.co/edit/KcbtzEyNMA8s1X7Hja8p?p=preview
źródło
Jeśli masz wiele pól wyboru w tym samym formularzu
Kod kontrolera
Wyświetl kod
źródło
Inspirowany postem Yoshi powyżej. Oto plnkr .
źródło
W oparciu o mój drugi post tutaj wydałem dyrektywę wielokrotnego użytku.
Sprawdź repozytorium GitHub
źródło
W HTML (zakładając, że pola wyboru znajdują się w pierwszej kolumnie każdego wiersza w tabeli).
W
controllers.js
pliku:źródło
Oto kolejne rozwiązanie. Zaletą mojego rozwiązania:
Oto dyrektywa:
Na koniec użyj tego w następujący sposób:
I to wszystko. Jedynym dodatkiem jest
checkbox-array-set
atrybut.źródło
Możesz łączyć AngularJS i jQuery. Na przykład musisz zdefiniować tablicę
$scope.selected = [];
w kontrolerze.Możesz uzyskać tablicę będącą właścicielem wybranych elementów. Metodą
alert(JSON.stringify($scope.selected))
możesz sprawdzić wybrane elementy.źródło
źródło
Spójrz na to: lista kontrolna-model .
Działa z tablicami JavaScript i obiektami i może używać statycznych pól wyboru HTML bez powtórzeń ng
I strona JavaScript:
źródło
Prosty sposób na zrobienie tego tylko w języku HTML:
źródło
Korzystając z tego przykładu @Umur Kontacı, myślę, że przy użyciu do przechwytywania wybranych danych w innym obiekcie / tablicy, np. Na stronie edycji.
Opcje połowu w bazie danych
Przełącz jakąś opcję
Na przykład wszystkie kolory json poniżej:
Oraz 2 typy obiektów danych,
array
z jednym obiektem iobject
zawierającymi dwa / więcej danych obiektu:Wybrane dwa elementy wyłapane w bazie danych:
Wybrano jeden element złapany w bazie danych:
A tutaj mój kod javascript:
Mój kod HTML:
[Edytuj] Ponowny kod poniżej:
I wywołaj nową metodę, jak poniżej:
Otóż to!
źródło
Umieściłem tablicę w kontrolerze.
Na znacznikach umieściłem coś w rodzaju śledzenia
Wynik był następujący: w kontrolerze musiałem tylko sprawdzić, czy jest to prawda, czy fałsz; true dla zaznaczone, brak / false dla niezaznaczone.
Mam nadzieję że to pomoże.
źródło
Myślę, że następujący sposób jest bardziej przejrzysty i użyteczny dla zagnieżdżonych powtórzeń ng. Sprawdź to na Plunker .
Cytat z tego wątku :
źródło
Oto link jsFillde do tego samego, http://jsfiddle.net/techno2mahi/Lfw96ja6/ .
Wykorzystuje to dyrektywę, którą można pobrać ze strony http://vitalets.github.io/checklist-model/ .
Dobrze jest mieć dyrektywę, ponieważ aplikacja będzie często potrzebować tej funkcji.
Kod jest poniżej:
HTML:
JavaScript
źródło
<div>
niż zakończenie</div>
. Czy coś pominąłeś?Wypróbuj moje dziecko:
**
**
Następnie dla dowolnego modelu ng z polami wyboru zwróci ciąg wszystkich wybranych danych wejściowych:
źródło