В моей HTML-странице у меня есть два набора булевых переключателей: Labeled: "Да" и "Нет" /Значения: True и False соответственно. Я заполняю полную форму из таблицы базы данных PostgreSQL, чтобы позволить аутентифицированному пользователю просматривать форму с заполненными данными и редактировать заполненные поля, включая переключатели, а затем сохранять форму, которая будет сохранять данные в БД. Все остальные текстовые поля заполняются без проблем; это как набор переключателей, с которыми у меня возникает проблема с предварительным проверкой переключателей.
В приведенном ниже примере не предварительно заполняется флажок с проверкой на переднем конце (но добавляется правильный атрибут, отмеченный в источнике HTML):
<input id="billing-no" type="radio" name="billing" ng-model="person.billing" value="FALSE" ng-checked="person.billing == 'false'" />
<input id="billing-yes" type="radio" name="billing" ng-model="person.billing" value="TRUE" ng-checked="person.billing == 'true'" />
Однако, это проверяет правильный переключатель при загрузке:
<input id="billing-no" type="radio" name="billing" value="FALSE" ng-checked="person.billing == 'false'" />
<input id="billing-yes" type="radio" name="billing" value="TRUE" ng-checked="person.billing == 'true'" />
Примечание. Мне нужно было проверить значение булевской строки в директиве ng-checked, поскольку логическое значение всегда возвращается в виде строки из PostgreSQL. Это, по-видимому, было частью дизайна PostgreSQL при запросе данных из столбцов с булевыми типами данных.
При добавлении директивы ng-model радиокнопка больше не проверяется (по крайней мере, в режиме просмотра браузера). Нечетная часть заключается в том, что я посмотрел на источник, и он четко проверяет правильность. Что еще более странно, так это то, что я дважды нажимаю на переключатель, чтобы "проверить" его. Я тестировал это в последней версии Chrome, FF и IE, и все это приводит к той же проблеме.
Вопрос: при добавлении директивы ng-model, почему источник HTML добавляет "проверено" в атрибут радиокнопки, но, похоже, не помечает переключатель? Кроме того, почему мне нужно дважды щелкнуть переключатель, который должен быть проверен?
Решение: Чтобы исправить это, я удалил директиву ng-checked из переключателей и использовал только ng-модель, как это было предложено @Cypher и @aet. Затем я заменил значение атрибута директивой ng-value "true" и "false". После этого я устанавливаю значения в контроллере.
HTML
<input id="billing-no" type="radio" name="billing" ng-model="person.billing" ng-value="false" />
<input id="billing-yes" type="radio" name="billing" ng-model="person.billing" ng-value="true" />
Angular JS
app.controller('peopleCtrl', function($scope, peopleFactory){
...
peopleFactory.getPerson(personParams).then(function(data){
$scope.person = data;
/* moved from ng-checked */
$scope.person.billing = data.billing == 'true';
});
...
};