选中Mat复选框,不更改复选框状态

时间:2018-04-10 08:50:34

标签: angular checkbox angular-material2

我正在实现一个语言切换组件,该组件显示复选框,一个用于应用的每种语言(使用@ngx-translate翻译)。

点击其中一个复选框后,应用语言已正确切换,但点击的复选框仍然未选中。

模板:

<mat-checkbox [checked]="selectedLanguage == 'en'" (click)="switchLanguage('en')">English</mat-checkbox>
<mat-checkbox [checked]="selectedLanguage == 'fr'" (click)="switchLanguage('fr')">French</mat-checkbox>
<mat-checkbox [checked]="selectedLanguage == 'de'" (click)="switchLanguage('de')">German</mat-checkbox>

组件:

export class CheckboxOverviewExample {
  public selectedLanguage: string;

  constructor(){
    this.selectedLanguage = 'fr';
  }

  public switchLanguage(lang: string) {
    this.selectedLanguage = lang;
    // this.translateService.use(lang); // changing ngx-translate language
    console.log('Switched to ' + lang);
  }
}

当您路由到组件时,[checked]绑定正在运行。登陆组件时确实检查了法语的mat-checkbox(默认值)。现在,当我点击德语或英语时,语言会切换,法语复选框会正确取消选中,但点击的复选框不会检查。

我遗漏了一些东西,可能是一个小细节,但我不明白为什么德语/英语不会检查,而法语正确取消选中。

请查看this simple stackblitz code以重现我的案例。

4 个答案:

答案 0 :(得分:4)

所以我有一个答案给你。不需要使用单选按钮,因为您的设计师讨厌使用

<mat-checkbox [checked]="selectedLanguage === 'en'" (change)="switchLanguage('en')">English</mat-checkbox>
<mat-checkbox [checked]="selectedLanguage === 'fr'" (change)="switchLanguage('fr')">French</mat-checkbox>
<mat-checkbox [checked]="selectedLanguage ==='de'" (change)="switchLanguage('de')">German</mat-checkbox>

使用selectedLanguage === 'en'

检查类型和值

另外,使用(change)="switchLanguage('de')代替点击

工作here 或检查this

答案 1 :(得分:2)

对于其他答案,您可以选择不使用单独的函数来处理change事件,而是分配一个如下所示的值: (change)="myBooleanVar = $event.source.checked"此示例不适用于OP,但对使用复选框分配是/否值的其他人可能有用。

答案 2 :(得分:1)

您应该使用 (change) 而不是 (click) 。您的模板应更改为:

<mat-checkbox [checked]="selectedLanguage === 'en'" (change)="switchLanguage($event, 'en')">English</mat-checkbox>
<mat-checkbox [checked]="selectedLanguage === 'fr'" (change)="switchLanguage($event, 'fr')">French</mat-checkbox>
<mat-checkbox [checked]="selectedLanguage === 'de'" (change)="switchLanguage($event, 'de')">German</mat-checkbox>

...你的功能将如下所示:

public switchLanguage(event: MatCheckboxChange, lang: string) {
    if(event.checked && this.selectedLanguage!== lang){
        this.selectedLanguage = lang;
        // this.translateService.use(lang); // changing ngx-translate language
        console.log('Switched to ' + lang);
    }
}

请务必导入 MatCheckboxChange

import { MatCheckboxChange} from '@angular/material';`

链接到Demo

您应该使用radio buttons来解决此问题。当您只需要选择一个选项时,复选框不是正确的方法。

<mat-radio-group [value]="selectedLanguage">
  <mat-radio-button value="en" (click)="switchLanguage('en')">English</mat-radio-button>
  <mat-radio-button value="fr" (click)="switchLanguage('fr')">French</mat-radio-button>
  <mat-radio-button value="de" (click)="switchLanguage('de')">German</mat-radio-button>
</mat-radio-group>

这是StackBlitz Demo

答案 3 :(得分:0)

(点击)是一个DOM事件,而(更改)是从Angular框架生成的。

点击将具有一个通用的DOM事件对象,然后更改MatCheckboxChange对象。

首先触发。