单击时取消选中活动的Angular Material切换按钮

Mat*_*ers 8 angular-material2 angular

我需要修改标准Angular Material切换按钮组件的功能,以便单击活动按钮可使该组件返回没有按钮处于活动状态。这有两个步骤:

  • 更新切换组的值
  • 将点击按钮的“ checked”参数更改为false

我尝试了几种方法,例如

模板:

<mat-button-toggle-group #group="matButtonToggleGroup">
    <mat-button-toggle #no_btn value="no" (click)="update_toggle(group,no_btn)">No</mat-button-toggle>
    <mat-button-toggle #yes_btn value="yes" (click)="update_toggle(group,yes_btn)">Yes</mat-button-toggle>
</mat-button-toggle-group>
Run Code Online (Sandbox Code Playgroud)

JS:

update_toggle(group,button){
    if(group.value==""){
        group.value = button.value;
    }
    else
    {
        group.value = "";
    }
button.checked=!button.checked;
}
Run Code Online (Sandbox Code Playgroud)

但这不会更新按钮的“已检查”值,我想是因为update_toggle()设置的组值与用户单击按钮的行为相冲突。

唯一有效的方法是:

<mat-button-toggle-group #group="matButtonToggleGroup">
    <mat-button-toggle #no_btn value="no" (click)="update_toggle(group,no_btn)" (click)="group.value=='no' ? checked=false : checked=false">No</mat-button-toggle>
    <mat-button-toggle #yes_btn value="yes" (click)="update_toggle(group,yes_btn)" (click)="group.value=='yes' ? checked=false : checked=false">Yes</mat-button-toggle>
</mat-button-toggle-group>
Run Code Online (Sandbox Code Playgroud)

但是单个按钮上的两次单击事件感觉很棘手,特别是因为第二次单击中的三进制与本能地相反。

有什么更好的建议吗?

我试过了:

@ViewChildren('no_btn') no_btn: ElementRef;
Run Code Online (Sandbox Code Playgroud)

然后:

this.no_btn['_results'][k]['_inputElement']['nativeElement']['checked']=false;
Run Code Online (Sandbox Code Playgroud)

但是结果似乎与在函数中传递按钮引用没有什么不同。再次单击该按钮不会取消选中它。禁用确实有效,所以我认为我的代码是正确的:

this.no_btn['_results'][k]['_inputElement']['nativeElement']['disabled']=true;
Run Code Online (Sandbox Code Playgroud)

G. *_*ter 9

一个简单的通用解决方案不需要使用每个按钮上的事件或单击事件,也不需要ViewChildren或对值进行硬编码检查,可以在多种模式下使用按钮切换并通过组更改来管理选择事件。change事件为您提供了所需的一切,因此无需直接访问子组件:

<mat-button-toggle-group multiple (change)="toggleChange($event)">
    <mat-button-toggle value="no">No</mat-button-toggle>
    <mat-button-toggle value="yes">Yes</mat-button-toggle>
</mat-button-toggle-group>

toggleChange(event) {
    let toggle = event.source;
    if (toggle) {
        let group = toggle.buttonToggleGroup;
        if (event.value.some(item => item == toggle.value)) {
            group.value = [toggle.value];
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

它在Stackblitz上