Подтвердить что ты не робот

Кнопки радио ng-check с ng-model

В моей 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';
    });
    ...
};
4b9b3361

Ответ 1

Я думаю, вы должны использовать только ng-модель и должны хорошо работать для вас, вот ссылка на официальную документацию angular https://docs.angularjs.org/api/ng/input/input%5Bradio%5D

Код из примера не должен быть трудно адаптировать к конкретной ситуации:

<script>
   function Ctrl($scope) {
      $scope.color = 'blue';
      $scope.specialValue = {
         "id": "12345",
         "value": "green"
      };
   }
</script>
<form name="myForm" ng-controller="Ctrl">
   <input type="radio" ng-model="color" value="red">  Red <br/>
   <input type="radio" ng-model="color" ng-value="specialValue"> Green <br/>
   <input type="radio" ng-model="color" value="blue"> Blue <br/>
   <tt>color = {{color | json}}</tt><br/>
</form>

Ответ 2

Я решил свою проблему просто используя ng-init для выбора по умолчанию вместо ng-checked

<div ng-init="person.billing=FALSE"></div>
<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" />

Ответ 3

Пожалуйста, объясните, почему используется одна и та же ng-модель? И какое значение передается через ng- model и как оно передается.. чтобы быть более конкретным, если я использую console.log(color), какой будет выход?

Ответ 4

[Личный вариант] Избегание использования $scope на основе John Papa Angular Руководство по стилю

поэтому моя идея использует текущую модель:

(function(){
  'use strict';
  
   var app = angular.module('way', [])
   app.controller('Decision', Decision);

   Decision.$inject = [];     

   function Decision(){
     var vm = this;
     vm.checkItOut = _register;

     function _register(newOption){
       console.log('should I stay or should I go');
       console.log(newOption);  
     }
   }

     
     
})();
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<div ng-app="way">
  <div ng-controller="Decision as vm">
    <form name="myCheckboxTest" ng-submit="vm.checkItOut(decision)">
 <label class="radio-inline">
  <input type="radio" name="option" ng-model="decision.myWay"
                           ng-value="false" ng-checked="!decision.myWay"> Should I stay?
                </label>
                <label class="radio-inline">
                    <input type="radio" name="option" ng-value="true"
                           ng-model="decision.myWay" > Should I go?
                </label>
  
</form>
  </div>
  
</div>