AngularJS-ラジオボタンをブール値のモデルにバインドする


199

プロパティにブール値があるオブジェクトにラジオボタンをバインドするときに問題が発生します。$ resourceから取得した試験問題を表示しようとしています。

HTML:

<label data-ng-repeat="choice in question.choices">
  <input type="radio" name="response" data-ng-model="choice.isUserAnswer" value="true" />
  {{choice.text}}
</label>

JS:

$scope.question = {
    questionText: "This is a test question.",
    choices: [{
            id: 1,
            text: "Choice 1",
            isUserAnswer: false
        }, {
            id: 2,
            text: "Choice 2",
            isUserAnswer: true
        }, {
            id: 3,
            text: "Choice 3",
            isUserAnswer: false
        }]
};   

このサンプルオブジェクトでは、 "isUserAnswer:true"プロパティによってラジオボタンが選択されることはありません。ブール値を引用符でカプセル化すると、機能します。

JS:

$scope.question = {
    questionText: "This is a test question.",
    choices: [{
            id: 1,
            text: "Choice 1",
            isUserAnswer: "false"
        }, {
            id: 2,
            text: "Choice 2",
            isUserAnswer: "true"
        }, {
            id: 3,
            text: "Choice 3",
            isUserAnswer: "false"
        }]
};   

残念ながら、私のRESTサービスはそのプロパティをブール値として扱い、これらの値を引用符でカプセル化するようにJSONシリアル化を変更することは困難です。モデルの構造を変更せずにモデルバインディングを設定する別の方法はありますか?

これは、動作していないオブジェクトと動作しているオブジェクトを示すjsFiddleです

回答:


376

Angularjsでの正しいアプローチはng-value、モデルの非文字列値に使用することです。

次のようにコードを変更します。

<label data-ng-repeat="choice in question.choices">
  <input type="radio" name="response" data-ng-model="choice.isUserAnswer" data-ng-value="true" />
  {{choice.text}}
</label>

参照:馬の口からまっすぐ


12
重要な補足事項を追加したかっただけです:ng-valueには中括弧なしの値が必要です{{}}例:ng-value = "choice2.id" vs value = "{{choice2.id}}"
Andi

はい、それは正しいです
。ng

@Andiこのサイドノートをありがとう、それは私にデバッグの時間を節約しました!
ロイミルダー2014年

3
あなたは意味DATA-私が思う接頭辞を... DATA-プレフィックスは(また、そのことなく、すべての近代的なブラウザは正しくHTMLを扱うが)HTMLを有効にすることです
kumarharsh

6
投稿がかなり古いことは知っていますが、同じ問題が発生しました。しかし、私があなたのソリューションを使用してラジオボタンを変更すると、一度選択されたすべてがtrueになり、falseに戻りません。これに対する解決策はありますか?(問題はOPのフィドルにも存在します)
ドミニクG

21

これはでの奇妙なアプローチisUserAnswerです。本当に3つの選択肢すべてをサーバーに送り返し、サーバーはそれぞれのチェックをループしisUserAnswer == trueますか?もしそうなら、これを試すことができます:

http://jsfiddle.net/hgxjv/4/

HTML:

<input type="radio" name="response" value="true" ng-click="setChoiceForQuestion(question1, choice)"/>

JavaScript:

$scope.setChoiceForQuestion = function (q, c) {
    angular.forEach(q.choices, function (c) {
        c.isUserAnswer = false;
    });

    c.isUserAnswer = true;
};

または、タックを変更することをお勧めします。

http://jsfiddle.net/hgxjv/5/

<input type="radio" name="response" value="{{choice.id}}" ng-model="question1.userChoiceId"/>

そうすれば{{question1.userChoiceId}}、サーバーに送り返すことができます。


御返答いただき有難うございます。私はあなたの2番目のソリューションが理想的であることを知っています。ただし、アプリは実際には、「該当するものすべてをチェック」の質問を含む複数のタイプの質問をサポートしています。したがって、各選択肢に値が保存される理由です。私が言えることから、最初のソリューションは、選択が行われた後にモデルを更新するために機能しますが、すでに選択が行われた状態でサーバーから取得されたモデルを表示するためには機能しません。
peteallen 2013

2
ああ、そうだ。これを解決するには、を使用しngCheckedます。ただし、文字列としてtrue / falseを使用しないようにする必要があります。できますか?jsfiddle.net/hgxjv/6
ラングドン

3
はい、うまくいきます!以前にngCheckedを使用してみましたが、ngModel属性は削除していませんでした。その構成では機能しませんでした。ngCheckedがラジオボタンと互換性がないためと考えられていました。ngModel属性を削除し、ngCheckedを使用してngClickをsetChoiceForQuestion関数にバインドすると、私がやろうとしていることが実現します。ご協力ありがとうございました!
peteallen 2013

10
 <label class="rate-hit">
     <input type="radio" ng-model="st.result" ng-value="true" ng-checked="st.result">
     Hit
 </label>
 &nbsp;&nbsp;
 <label class="rate-miss">
     <input type="radio" ng-model="st.result" ng-value="false" ng-checked="!st.result">
     Miss
 </label>

私はこれtrueが真に評価されるのでのみ機能すると思います。あなたの場合はng-value例えば、文字列、およびないで何かへの参照で$scope、あなたは引用符でその文字列を配置する必要があります。それが私には当てはまりました。
Jason Swett

これが私にとって最良の答えです!ありがとう、ロネル!
ギスウェイ2018

ng-modelが定義されている限り、ここではng-checkedは必要ありません
Nico Westerdale

7

に変更value="true"してみましたがng-value="true"、動作するようです。

<input type="radio" name="response2" data-ng-model="choice.isUserAnswer" ng-value="true" />

また、例で両方の入力を機能させるには、各入力に異なる名前を付けるresponse必要がresponse1ありresponse2ます。たとえば、とにする必要があります。


1
いいえ、名前は同じにすることができます。
kumarharsh 2013


0

無線がフィドルでセットアップされる方法-同じモデルを共有する-は、すべての真実の値を引用することにした場合、最後のグループのみにチェック済みの無線を表示します。より堅実なアプローチには、個々のグループに独自のモデルを与え、IDなどの無線の一意の属性として値を設定することが含まれます。

$scope.radioMod = 1;
$scope.radioMod2 = 2;

新しいhtmlを以下に示します。

<label data-ng-repeat="choice2 in question2.choices">
            <input type="radio" name="response2" data-ng-model="radioMod2" value="{{choice2.id}}"/>
                {{choice2.text}}
        </label>

そしてフィドル。


0

ブール変数を使用してラジオボタンをバインドしている場合。以下のサンプルコードを参照してください

<div ng-repeat="book in books"> 
<input type="radio" ng-checked="book.selected"  
ng-click="function($event)">                        
</div>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.