Angular2 - md-slide-toggle 显示错误的值

Angular2 - md-slide-toggle displays the wrong value

我的问题是 md-slide-toggle 具有正确的值,但显示错误。

例如:

开始时值为 1,切换处于活动状态。

  1. 按下开关的时间:值为 0 但开关仍处于活动状态。

  2. 按下开关的时间:值为 1,但现在开关处于非活动状态。

  3. ...

在这里查看:https://plnkr.co/edit/kxehpwaat5dezNActZbn?p=preview

//.html

<md-card>
  <md-slide-toggle ngDefaultControl (click)="onClick()"
     [ngModel]="(device)"></md-slide-toggle>
     {{device}}
</md-card>

//.ts

device:number = 1;

onClick() {
            let tmp;
            if (this.device == 1){
               tmp=0;
            }
            if (this.device == 0){
               tmp=1;
            }
            this.device=tmp;
        }
}

你是对的,之前没有使用过 Slide Toggle Component,默认情况下这似乎是一种奇怪的行为,尽管这似乎有效:

取自您的 Plunker:

模板

<md-card>
     <md-slide-toggle 
      ngDefaultControl 
      (change)="onChange($event)" 
      [checked]="device"></md-slide-toggle>
     {{device}}
</md-card>

TS

import {Component} from '@angular/core';

@Component({
  selector: 'slide-toggle-overview-example',
  templateUrl: './slide-toggle-overview-example.html',
})
export class SlideToggleOverviewExample {

  device:number = 1;

  onChange(e: Event) {
        if (e.checked == true) {
          this.device = 1;
        } else {
          this.device = 0;
        }
    }
}

Working Plunker

一开始我以为是你同时使用了ngModel绑定click绑定,其实不是这种情况(因为我最终注意到你使用的是单向)。当您尝试分配数值而不是 boolean.

时,它们似乎从一开始就不同步

因为这 确实 也按预期工作:

模板

<md-card>
     <md-slide-toggle ngDefaultControl
     [(ngModel)]="device"></md-slide-toggle>
     {{device}}
</md-card>

TS

import {Component} from '@angular/core';

@Component({
  selector: 'slide-toggle-overview-example',
  templateUrl: './slide-toggle-overview-example.html',
})
export class SlideToggleOverviewExample {
  device:boolean = true;
}

尽管如此,ng 团队似乎至少知道问题“Slide toggle - (change) event will be fired even when the slider has not change.

中提到的这个问题的一个版本

您必须从事件中找到对象 属性 检查值。我的工作代码

模板

<md-card>
     <md-slide-toggle 
      [(ngModel)]="device"
      (change)="onChange($event)"></md-slide-toggle>
     {{device}}
</md-card>

TS

 import {Component} from '@angular/core';

 @Component({
  selector: 'slide-toggle-overview-example',
  templateUrl: './slide-toggle-overview-example.html',
 })
 export class SlideToggleOverviewExample {

  device:number = 1;

  onChange(value) {
        if (value.checked == true) {
          this.device = 1;
          console.log(1);
        } else {
          this.device = 0;
          console.log(0);
        }
    }
}

我用 setTimeout 解决了这个问题; 在您的 html 文件中,将 id 添加到 #contract

<mat-slide-toggle color="primary" formControlName="contract" #contract>
  Contract
</mat-slide-toggle>

在你的 .ts 文件中使用

@ViewChild('contract') contract: MatSlideToggle;

在构造函数之前;

ngOnInit()里面 添加简单:

setTimeout(() => {
  this.contract.toggle();
});

对我有用

在你的Html

 <mat-slide-toggle [checked]="flags" (change)="flagsChange();" color="primary">
                            {{flags ? 'YES' : 'NO'}}</mat-slide-toggle>

在 TS

  reimbursableChange() {
    if (!this.flags.reimbursable) {
      this.flags.reimbursable = true;
    } else {
      this.flags.reimbursable = false;
    }
  }