仅允许选中一个复选框,Angular 最佳实践。

问题描述 投票:0回答:6

我正在使用角度。 我在一个组中有三个复选框,我想确保只能选中其中一个。因此,如果其中一个被检查,另外两个就必须被解锁。我可以考虑使用本机 JS 或 jQuery 来完成此操作,但我想知道是否有典型的 Angular 方法来完成此操作。

这是带有复选框和角度控制设置的 Plunker。 http://plnkr.co/edit/IZmGwktrCaYNyrWjfSqf?p=preview

<body ng-controller="MainCtrl">

  <div>
    {{vm.Output}}

    <br>
    <br>
    <br>
    <label>
      <input type="checkbox" name="groupA" ng-model="vm.a1" ng-change="vm.changeGroupA()"> A1 </label>
    <label>
      <input type="checkbox" name="groupA" ng-model="vm.a2" ng-change="vm.changeGroupA()"> A2 </label>
    <label>
      <input type="checkbox" name="groupA" ng-model="vm.a3" ng-change="vm.changeGroupA()"> A3 </label>

    <br>
    <br>
    <br> {{vm.Output}}
</body>

javascript angularjs
6个回答
5
投票

由于您无法使用单选按钮,因此当您检查其中一个而其他按钮被取消选择时,我制作了此 plnkr:

http://plnkr.co/edit/apSE3cIXA7DIvulBfNGX?p=preview

 <label> <input type="checkbox" name="groupA" ng-model="vm.a1" ng-change="vm.a2 = false; vm.a3 = false; vm.changeGroupA()" >  A1  </label> 
 <label> <input type="checkbox" name="groupA" ng-model="vm.a2" ng-change="vm.a1 = false; vm.a3 = false; vm.changeGroupA()" >  A2  </label>
 <label> <input type="checkbox" name="groupA" ng-model="vm.a3" ng-change="vm.a2 = false; vm.a1 = false; vm.changeGroupA()" >  A3  </label>

希望有帮助=)

编辑:您可以更改控制器中其他复选框的状态以获得最佳实践,在 html 中制作只是为了更快地演示..


1
投票

另一种方法是:http://plnkr.co/edit/kH12pYkXfY6t6enrlSns

  <br><br><br>
  <label> <input type="checkbox" name="groupA" ng-model="vm.groupA[0]" ng-change="vm.changeGroupA(0)" >  A1  </label> 
  <label> <input type="checkbox" name="groupA" ng-model="vm.groupA[1]" ng-change="vm.changeGroupA(1)" >  A2  </label>
  <label> <input type="checkbox" name="groupA" ng-model="vm.groupA[2]" ng-change="vm.changeGroupA(2)" >  A3  </label>

  <br><br><br>

控制器看起来像这样:

$scope.vm = {

  groupA: [false, true, false],
  count : 0,

  changeGroupA : function (index)
  {


    for (i = 0, len = this.groupA.length; i < len; ++i) {
      this.groupA[i] = ((1 << index) & (1 << i)) > 0;
    }


    this.Output = '(' + this.count + ')' + this.Output;
    this.count ++;

  },

  Output : 'Here we go'

}

0
投票

你可能想以艰难的方式做到这一点。 http://plnkr.co/edit/A53w4IJMRXQmvRsxa8JA它应该可以工作


changeGroupA : function (x)
  {
    if (x === 'A1'){
      $scope.vm.a1 = true;
      $scope.vm.a2 = false;
      $scope.vm.a3 = false;
    }
    else if (x === 'A2') {
      $scope.vm.a2 = true;
      $scope.vm.a1 = false;
      $scope.vm.a3 = false;
    }
    else if (x === 'A3') {
      $scope.vm.a3 = true;
      $scope.vm.a1 = false;
      $scope.vm.a2 = false;
    }
    this.Output = '(' + this.count + ')' + this.Output;
    this.count ++;
  },


0
投票

这对于 6 或 8 角度来说效果非常好

HTML:

<div class="custom-control custom-checkbox custom-control-inline">
                <input type="checkbox" class="custom-control-input" id="check1id" 
                [(ngModel)]="check1" (change)="onlyOneValue($event)"/>
                <label for="check1id" class="custom-control-label">Checkbox 1</label>
</div>

<div class="custom-control custom-checkbox custom-control-inline">
                <input type="checkbox" class="custom-control-input" id="check2id"
                [(ngModel)]="check2" (change)="onlyOneValue($event)" />
                <label for="check2id" class="custom-control-label"> Checkbox 2 </label>
</div>

.ts代码:

check1=false;
check2=false;
onlyOneValue(e)
{
  if (e.target.id == "Check1id") {
      this.Check1= true;
      this.Check2 = false;
    }
 else  if (e.target.id == "Check1id") {
      this.Check1= true;
      this.Check2 = false;
    }
}

0
投票

在 HTML 中:

<input
      (click)="onDefaultCheckboxClick(default)"
      #default
      type="checkbox"
      name=""
      id=""
    />

在 component.ts 文件中:

@ViewChildren("default") default:QueryList<ElementRef>  ;

  

   onDefaultCheckboxClick(element) {
        this.default.forEach((element) => {
         element.nativeElement.checked = false;
    });
    element.checked = !element.checked;
  }

-1
投票

为什么不直接使用单选按钮呢?

<label>
  <input type="radio" name="groupA" ng-model="vm.a1" ng-change="vm.changeGroupA()"> A1 </label>
<label>
  <input type="radio" name="groupA" ng-model="vm.a2" ng-change="vm.changeGroupA()"> A2 </label>
<label>
  <input type="radio" name="groupA" ng-model="vm.a3" ng-change="vm.changeGroupA()"> A3 </label>
© www.soinside.com 2019 - 2024. All rights reserved.