AngularJS:ng-modelがngにバインドされていません-チェックボックスがチェックされています


80

私はこの質問をする前にこれを参照しました。

AngularJsはngをバインドしません-ng-modelでチェック

側でng-checked評価さtrueれた場合htmlng-modelは更新されません。ng-repeatチェックボックスごとにスタイルを使用する必要があるため、上記の質問で提案されているようにできません。

これが私の問題を説明するために作成したプランカーです。

http://plnkr.co/edit/YsOsPh3vjkPMUUDa6r2t

欲しいものを見るには、コンソールを開いてSubmitボタンをクリックしてください。チェックボックスはチェックしないでください。

前もって感謝します!

回答:


122

ngModelそして、ngChecked一緒に使用することを意味するものではありません。

ngCheckedは式を期待しているので、とng-checked="true"言うことで、基本的にチェックボックスはデフォルトで常にチェックされていると言っています。

ngModelモデルのブールプロパティに関連付けられた、を使用できるはずです。他のものが必要な場合はngTrueValue、and ngFalseValue(現在は文字列のみをサポート)を使用するか、独自のディレクティブを作成する必要があります。

あなたがやろうとしているのは正確には何ですか?デフォルトで最初のチェックボックスをオンにするだけの場合は、モデルを変更する必要があります- item1: true,

編集:モデルの現在の状態をデバッグするためにフォームを送信する必要はありません。ところで、{{testModel}}HTML(または<pre>{{testModel|json}}</pre>)にダンプするだけです。また、ngModel属性をに簡略化することもできますng-model="testModel.item1"

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


ng-checked式によってtrueに計算されます。ng-modelリンクされていないことを示すために、そこでtrueを使用しました。コントローラを起動するときに、すべてのチェックボックスをオフにします。いくつかのajaxリクエストの後ng-checked、チェックボックスをチェックするためにを計算します。これは私のng-modelが更新されていないときです。
アビラッシュ2013年

5
@Abilashを使用しないでくださいngChecked。モデルは問題ありませんtestModel.item1 = true。ajaxコールバックを設定してから、呼び出し$scope.$apply()てビューを更新するだけです。
ラングドン2013年

2
ng-checked代わりに使用するという間違いを犯しただけng-modelです...二度と!
g00glen00b 2014

docs.angularjs.org/api/ng/directive/ngCheckedの注記によると、「this(ngChecked)ディレクティブをngModelと一緒に使用しないでください。予期しない動作が発生する可能性があるため、注意してください。」
Abhijeet 2015

@Langdon私はこの問題で約数時間立ち往生していました。あなたのヒント$ scope。$ apply()は私の問題を解決しました。本当にありがとう。
ヌルポインタ

13

ng-value-trueを使用して、ng-modelが文字列であることをangularに伝えることができます。

そのように引用符を追加した場合にのみ、ng-true-valueを機能させることができました(公式のAngularドキュメント-https //docs.angularjs.org/api/ng/input/input%5Bcheckbox%5Dに示されています

ng-true-value="'1'"

おかげで、これは私のための修正でした!
Jesper1

1

あなたができることはng-repeat、あなたが繰り返しているものの価値をng-checkedそこに渡し、そこからng-class結果に応じてあなたのスタイルを適用することを利用することです。

私は最近似たようなことをしました、そしてそれは私のために働きました。


1

ng-initでも真になると宣言できます

<!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>

そして、あなたは最初のものとここにも示されているオブジェクトを選択することができますtrue、false、flase


の適切な使用法はごくわずかですngInit。このディレクティブを悪用して、テンプレートに不要な量のロジックを追加することができます。参照してくださいAngularJS NG-initを指令APIリファレンスを
georgeawg 2018

0

ディレクティブは一緒に使用すべきではありませんng-modelng-checked

ドキュメントから:

ngChecked

内部の式ngCheckedがtrueの場合、要素にchecked属性を設定します。

このディレクティブはngModel、予期しない動作につながる可能性があるため、と一緒に使用しないでください

AngularJSng-checkedディレクティブAPIリファレンス


代わりに、コントローラーから目的の初期値を設定します。

<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

ng-checkedを使用する場合は必要ありませんng-model。HTMLフォームでCRUDを実行している場合CREATEEDIT、データバインディング中にモードと一致するモードのモデルを作成するだけです。

CREATEモード:デフォルト値のみのモデル

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

編集モード:データベースからのモデル

$scope.dataModel = getFromDatabaseWithSameStructure()

次にEDITCREATEモードにng-model関係なく、データベースと同期するためにを一貫して利用できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.