在 AngularJS 如何取消选中单选按钮以使所有对象变为假

In AngularJS how to uncheck a radio button to make all objects become false

我有一个数组,里面有很多 "contact" 个对象。只有一个联系人可以是主要联系人(主要:true)。

我还有一个单选按钮 select 哪个联系人是主要联系人。

问:如何让一个联系人成为主要联系人并停用所有其他联系人(主要:false)?所以只有一个对象有 属性(主要:true),其余的为 false?

我的例子:http://plnkr.co/edit/Y3as4SXv2ZGQSF39W8O6?p=preview

.controller('ExampleController', ['$scope',
        function($scope) {
        $scope.addContList = [
            {
                email: "q@q.com",
                jobTitle: "clerk",
                name: "nico2",
                phone: "1",
                primary: true
            },
            {
                email: "a@a.com",
                jobTitle: "director",
                name: "david",
                phone: "1",
                primary: false
            }
        ];
          $scope.$watch('addContList', function() {
            console.log('changed', JSON.stringify($scope.addContList, null, 2))
          }, true)

        }
      ]);

这是风景

<tr ng-repeat="contact in addContList">
          <td>
            <label class="radio-inline">
              <input type="radio" value="" name="ui_cont" ng-model="contact.primary" ng-value="true">
            </label>
          </td>
          <td>{{ contact.name }} value = {{contact.primary}} </td>
          <td>Edit</td>
          <td>Delete</td>
        </tr>

您可能希望向您的输入添加一个 ngChange 事件,并在一个设置为 true 时将所有其他输入更改为 false。我在这里更新了你的 Plnkr:http://plnkr.co/edit/7gxI7if9nC7hAMQES1eu?p=preview

<input type="radio" value="" name="ui_cont" ng-change='changeOnPrimary(contact)' ng-model="contact.primary" ng-value="true">

然后在你的控制器中:

$scope.changeOnPrimary = function(selectedContact) {
  // iterate over your whole list
  angular.forEach($scope.addContList, function(contact) {
    // set primary to false for all contacts excepts selected
    if (selectedContact.name !== contact.name) {
      contact.primary = false;
    }
  });
}

请注意:我比较对象的名称字段的唯一原因是因为没有可比较的唯一标识符。在实际代码中,您可能希望与 ID 而不是名称字段进行比较。

您可以定义一个新的作用域属性

$scope.primary = null

然后你可以定义一个监听器

$scope.$watch("primary", function(value) {
  $scope.addContList.forEach(function(contact) {
    contact.primary = angular.equals(value, contact);
  })
})

并且可以在定义列表后定义一个默认值

$scope.primary = $scope.addContList[0];

并在 html 中更改

中的输入行
<input type="radio" value="" name="ui_cont" ng-model="$parent.primary" ng-value="contact">

您需要使用 $parent.primary 而不是 primary,因为 ng-repeat 定义了一个新的子作用域。

http://plnkr.co/edit/5pvatBNwnrJhGzKhOIys?p=preview