AngularJS: ng-model nie wiąże się z ng-zaznaczone dla pól wyboru


80

Odniosłem się do tego, zanim zadałem to pytanie.

AngularJs nie wiąże ng-check z ng-model

Jeśli ng-checkedjest oceniany jako truepo htmlstronie, ng-modelnie jest aktualizowany. Nie mogę, ng-repeatjak zasugerowano w powyższym pytaniu, ponieważ muszę użyć stylu dla każdego pola wyboru.

Oto plunker, który stworzyłem, aby zilustrować mój problem.

http://plnkr.co/edit/YsOsPh3vjkPMUUDa6r2t

Aby zobaczyć, czego chcę, otwórz konsolę i po prostu kliknij Submitprzycisk. Nie zaznaczaj żadnych pól wyboru.

Z góry dziękuję!

Odpowiedzi:


122

ngModeli ngCheckednie są przeznaczone do wspólnego użytku.

ngCheckedoczekuje wyrażenia, więc mówiąc ng-checked="true", po prostu mówisz, że pole wyboru będzie zawsze domyślnie zaznaczone.

Powinieneś być w stanie po prostu użyć ngModel, powiązanego z właściwością logiczną w swoim modelu. Jeśli chcesz czegoś innego, musisz albo użyć ngTrueValuei ngFalseValue(które obecnie obsługują tylko łańcuchy), albo napisać własną dyrektywę.

Co dokładnie próbujesz zrobić? Jeśli chcesz, aby pierwsze pole wyboru było domyślnie zaznaczone, powinieneś zmienić model - item1: true,.

Edycja: nie musisz przesyłać formularza, aby debugować bieżący stan modelu, przy okazji, możesz po prostu wrzucić {{testModel}}do HTML (lub <pre>{{testModel|json}}</pre>). ngModelMożesz również uprościć swoje atrybuty ng-model="testModel.item1".

http://plnkr.co/edit/HtdOok8aieBjT5GFZOb3?p=preview


ng-checkedjest obliczany na true przez wyrażenie. Aby wskazać ng-model, że nie jest powiązany, użyłem tam true. Podczas inicjowania kontrolera chcę, aby wszystkie pola wyboru były odznaczone. Po pewnym żądaniu Ajax obliczam, ng-checkedaby zaznaczyć pole wyboru. To jest, gdy mój ng-modelnie jest aktualizowany.
Abilash

5
@Abilash Nie powinieneś używać ngChecked. Twój model jest w porządku, wystarczy ustawić testModel.item1 = truewywołanie zwrotne w AJAX, a następnie zadzwonić, $scope.$apply()aby zaktualizować widok.
Langdon

2
Po prostu popełniliśmy błąd, używając ng-checkedzamiast ng-model... nigdy więcej!
g00glen00b

Zgodnie z uwagą na docs.angularjs.org/api/ng/directive/ngChecked „Zauważ, że ta dyrektywa (ngChecked) nie powinna być używana razem z ngModel, ponieważ może to prowadzić do nieoczekiwanego zachowania”.
Abhijeet

@Langdon Utknąłem w tym problemie przez około godziny ... Twoja wskazówka $ scope. $ Apply () rozwiązała mój problem. Wielkie dzięki.
Null Pointer


1

To, co możesz zrobić, to ng-repeatprzekazać wartość tego, co iterujesz, do, ng-checkeda stamtąd, wykorzystując ng-classswoje style w zależności od wyniku.

Zrobiłem ostatnio coś podobnego i to zadziałało.


1

Can Declare As the in ng-init również staje się prawdą

<!doctype html>
<html ng-app="plunker" >
  <head>
    <meta charset="utf-8">
    <title>AngularJS Plunker</title>
    <script>document.write('<base href="' + document.location + '" />');</script>
    <link rel="stylesheet" href="style.css">
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.0.6/angular.js"></script>
    <script src="app.js"></script>
  </head>
  <body ng-controller="MainCtrl" ng-init="testModel['item1']= true">
    <label><input type="checkbox" name="test" ng-model="testModel['item1']"  /> Testing</label><br />
    <label><input type="checkbox" name="test" ng-model="testModel['item2']" /> Testing 2</label><br />
    <label><input type="checkbox" name="test" ng-model="testModel['item3']" /> Testing 3</label><br />
    <input type="button" ng-click="submit()" value="Submit" />
  </body>
</html>

I możesz wybrać pierwszy i obiekt również tutaj pokazany true, false, flase


Jest tylko kilka odpowiednich zastosowań ngInit. Ta dyrektywa może być nadużywana, aby dodać niepotrzebną ilość logiki do szablonów. Zobacz Dokumentacja API dyrektywy AngularJS ng-init .
georgeawg

0

Te ng-modeli ng-checkeddyrektywy nie powinny być używane razem

Z Dokumentów:

ngChecked

Ustawia atrybut zaznaczony na elemencie, jeśli wyrażenie wewnątrz ngCheckedjest prawdziwe.

Należy pamiętać, że tej dyrektywy nie należy używać razem zngModel , ponieważ może to prowadzić do nieoczekiwanego zachowania.

- Dokumentacja API dyrektywy AngularJS ng-Check


Zamiast tego ustaw żądaną wartość początkową ze sterownika:

<input type="checkbox" name="test" ng-model="testModel['item1']" ̶n̶g̶-̶c̶h̶e̶c̶k̶e̶d̶=̶"̶t̶r̶u̶e̶"̶ />
    Testing<br />
<input type="checkbox" name="test" ng-model="testModel['item2']" /> Testing 2<br />
<input type="checkbox" name="test" ng-model="testModel['item3']" /> Testing 3<br />
<input type="button" ng-click="submit()" value="Submit" />
$scope.testModel = { item1: true };

0

Nie potrzebujesz, ng-checkedkiedy używasz ng-model. Jeśli wykonujesz CRUD na formularzu HTML, po prostu utwórz model dla CREATEtrybu, który jest spójny z twoim EDITtrybem podczas wiązania danych:

Tryb CREATE: Modeluj tylko z wartościami domyślnymi

$scope.dataModel = {
   isItemSelected: true,
   isApproved: true,
   somethingElse: "Your default value"
}

Tryb EDYCJI: Model z bazy danych

$scope.dataModel = getFromDatabaseWithSameStructure()

Następnie, niezależnie od tego, EDITczy CREATEtryb, możesz konsekwentnie używać swojego ng-modeldo synchronizacji z bazą danych.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.