AngularJS - привязка переключателей к моделям с булевыми значениями
У меня проблема с привязкой переключателей к объекту, свойства которого имеют логические значения. Я пытаюсь отобразить вопросы экзамена, полученные из $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 показывает неработающие и рабочие объекты
Ответы
Ответ 1
Правильный подход в 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>
Ссылка: Прямо от устья лошади
Ответ 2
Это нечетный подход с isUserAnswer
. Вы действительно собираетесь отправить все три варианта обратно на сервер, где он будет проходить через каждый, проверяющий на 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}}
обратно на сервер.
Ответ 3
<label class="rate-hit">
<input type="radio" ng-model="st.result" ng-value="true" ng-checked="st.result">
Hit
</label>
<label class="rate-miss">
<input type="radio" ng-model="st.result" ng-value="false" ng-checked="!st.result">
Miss
</label>
Ответ 4
Я попытался изменить value="true"
на ng-value="true"
, и, похоже, он работает.
<input type="radio" name="response2" data-ng-model="choice.isUserAnswer" ng-value="true" />
Кроме того, чтобы оба входа работали в вашем примере, вам нужно было бы указать другое имя для каждого входа - например. response
должен стать response1
и response2
.
Ответ 5
Вы можете взглянуть на это:
https://github.com/michaelmoussa/ng-boolean-radio/
Этот парень написал специальную директиву, чтобы обойти проблему: "true" и "false" - это строки, а не booleans.
Ответ 6
Как ваши радиостанции настроены в скрипте - совместное использование одной и той же модели - приведет к тому, что только последняя группа покажет проверенную радиостанцию, если вы решите процитировать все правдивые значения. Более твердый подход предполагает предоставление отдельным группам собственной модели и задание значения как уникального атрибута радиостанций, таких как 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>
И скрипка.
Ответ 7
если вы используете логическую переменную для привязки переключателя. пожалуйста, обратитесь ниже пример кода
<div ng-repeat="book in books">
<input type="radio" ng-checked="book.selected"
ng-click="function($event)">
</div>