Angular2 - md-slide-toggle 显示错误的值
Angular2 - md-slide-toggle displays the wrong value
我的问题是 md-slide-toggle 具有正确的值,但显示错误。
例如:
开始时值为 1,切换处于活动状态。
按下开关的时间:值为 0 但开关仍处于活动状态。
按下开关的时间:值为 1,但现在开关处于非活动状态。
...
在这里查看: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;
}
}
}
一开始我以为是你同时使用了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;
}
}
我的问题是 md-slide-toggle 具有正确的值,但显示错误。
例如:
开始时值为 1,切换处于活动状态。
按下开关的时间:值为 0 但开关仍处于活动状态。
按下开关的时间:值为 1,但现在开关处于非活动状态。
...
在这里查看: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;
}
}
}
一开始我以为是你同时使用了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;
}
}