【问题标题】:Angular Material Checkbox Two-Way bindingAngular Material Checkbox 双向绑定
【发布时间】:2019-03-05 07:27:32
【问题描述】:

我有一个关于 Angular Material 复选框中双向绑定如何工作的问题。

这是来自app.component.html的HTML模板:

<div>
  <div *ngFor="let data of testData">
      <mat-checkbox [(ngModel)]="data.isActive" (change)="handleData(data)">{{data.isActive}}</mat-checkbox>
  </div>
</div>

这是组件(app.component.ts):

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

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent implements OnInit {

  testData: TestData[];

  ngOnInit() {
    this.testData = [];

    this.testData.push({
      label: 'testData1',
      isActive: false
    });

    this.testData.push({
      label: 'testData2',
      isActive: false
    });
  }

  handleData(data: TestData) {
    console.log(data.isActive);
    data.isActive = false;
  }
}

export class TestData {
  label: string;
  isActive: boolean;
}

默认情况下未选中所有复选框。当我第一次单击复选框时,handleData 处理程序中的data 参数在data.isActive 中接收true。之后我将其设置为false。相应的标签永远不会改变(它们总是false)。但我也希望复选框永远不会被选中。但它确实被检查了。为什么会这样?

更新 我刚刚添加了包含反映上述复选框的“结果”部分:

<div>
  <div *ngFor="let data of testData">
      <mat-checkbox [(ngModel)]="data.isActive" (change)="handleData(data)">{{data.isActive}}</mat-checkbox>
  </div>
</div>

<h2 class="example-h2">Result</h2>

<div>
  <div *ngFor="let data of testData">
    <mat-checkbox [(ngModel)]="data.isActive" (change)="handleData(data)">{{data.isActive}}</mat-checkbox>
  </div>
</div>

与上面的邻居不同,他们永远不会被检查。

【问题讨论】:

    标签: angular angular-material frontend


    【解决方案1】:

    当 Angular 没有完成由点击触发的变化检测周期时,该值可能被重置得太快。如果我们使用setTimeout 异步重置值,它会起作用(请参阅this stackblitz):

    handleData(data: TestData) {
      console.log(data.isActive);
      setTimeout(() => {
        data.isActive = false;
      });
    }
    

    或者如果我们在重置值之前调用ChangeDetectofRef.detectChanges()(参见this stackblitz):

    handleData(data: TestData) {
      console.log(data.isActive);
      this.changeDetectorRef.detectChanges();
      data.isActive = false;
    }
    

    【讨论】:

    • 它也适用于我的示例。例如,是否可以订阅角度变化检测器以便不依赖于超时?
    • 我先尝试了ChangeDetectorRef.detectChanges,但它似乎不起作用。见this stackblitz
    • 哦,但我发现如果我们在重置值之前调用它,它确实有效。我更新了我的答案。
    • 你是最伟大的!
    猜你喜欢
    • 2017-11-17
    • 1970-01-01
    • 1970-01-01
    • 2012-03-05
    • 2020-09-12
    • 2017-04-29
    • 1970-01-01
    • 2019-02-21
    • 2019-11-13
    相关资源
    最近更新 更多