代码之家  ›  专栏  ›  技术社区  ›  Evaldas Buinauskas

角度材质滑动切换捕捉状态

  •  1
  • Evaldas Buinauskas  · 技术社区  · 6 年前

    我有一个相当基本的滑动开关。我想在切换滑块后执行HTTP调用,如果HTTP调用失败,请将滑块恢复为初始值。我做的如下:

    import {Component} from '@angular/core';
    import { MatSlideToggleChange } from '@angular/material';
    import { FakeService } from './fake.service';
    
    @Component({
      selector: 'slide-toggle-configurable-example',
      templateUrl: 'slide-toggle-configurable-example.html'
    })
    export class SlideToggleConfigurableExample {
      isChecked = false;
      isCheckedInit = false;
    
      constructor(private readonly fakeService: FakeService) {}
    
      onChange(value: MatSlideToggleChange) {
        const { checked } = value;
    
        this.fakeService.throwUp(checked).subscribe(
          () => {},
          () => {
            this.isChecked = this.isCheckedInit;
          }
        );
      }
    }
    

    但是这不起作用。我的模板如下:

    <mat-slide-toggle
        (change)="onChange($event)"
        [checked]="isChecked">
      Slide me!
    </mat-slide-toggle>
    <section>
      {{ isChecked }}
    </section>
    

    但是 isChecked 值从不更改,并且始终显示为 false .

    我好像什么都没做 ISCHECK 字段更改其值。

    这里是一个 Stackblitz 以显示当前行为。

    为了得到想要的行为,我必须改变什么?

    1 回复  |  直到 6 年前
        1
  •  1
  •   user184994    6 年前

    首先要做的是 ngModel 而不是 checked ,具有双向绑定,如:

    <mat-slide-toggle
        (change)="onChange($event)"
        [(ngModel)]="isChecked">
      Slide me!
    </mat-slide-toggle>
    

    其次,您需要添加wrap the this.ischecked=this.ischeckedInit;in a setTimeout ,以便在完成材质之前不会将其设置为假。

    setTimeout(() => this.isChecked = this.isCheckedInit, 0);
    

    Here is a Stackblitz demo