Angular 2,复选框双向模型绑定(bind),不反射(reflect)组件内状态操作的选中状态

标签 angular

根据 Plunker

我有一系列复选框:

<label><input type="checkbox" name="foo" [(ngModel)]="foo" (change)="changed()">Foo</label>
<label><input type="checkbox" name="bar" [(ngModel)]="bar" (change)="changed()">Bar</label>
<label><input type="checkbox" name="baz" [(ngModel)]="baz" (change)="changed()">Baz</label>

选中所有三个复选框后,它们都应恢复为未选中状态:

changed() {
  if (this.foo && this.bar && this.baz) {
    this.foo = false;
    this.bar = false;
    this.baz = false;
  }

  console.log(`foo: ${this.foo};bar: ${this.bar};baz: ${this.baz}`)
}

相反,我看到的是第一次它似乎工作,但随后,在选中第三个复选框时,模型更新为 false,但是该复选框在 UI 中保持选中状态,变得不同步。

现在我已经通过传递事件并自己切换目标 dom 元素的选中状态来修复它。但我想知道它一开始是如何变得不同步的?有更好的解决方案吗?

最佳答案

如果值为 false 并且您单击复选框将值更改为 true 并且事件处理程序将其更改回 false,然后 Angular 变化检测看不到变化并且不更新绑定(bind)(尽管复选框保持其 true 值)。

constructor(private cdRef:ChangeDetectorRef) {}

changed() {
  this.cdRef.detectChanges();
  if (this.foo && this.bar && this.baz) {
    this.foo = false;
    this.bar = false;
    this.baz = false;
  }
  console.log(`foo: ${this.foo};bar: ${this.bar};baz: ${this.baz}`)
}

Plunker example

关于Angular 2,复选框双向模型绑定(bind),不反射(reflect)组件内状态操作的选中状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42620574/

相关文章:

javascript - Angular 7 - 没有具有未指定名称属性的表单控件的值访问器

javascript - 带有 javascript 和日期选择器的 Angular 2

javascript - Angular 7 中的访问函数

Angular 2 功能模块路由示例

angular - Angular 5 上的单元测试 http 服务

angular - 在Angular2的选择列表中设置最初选择的项目

javascript - 使用 Angular 2 加载多个子组件

angular - AfterAll 中 Angular SPA 的 Karma+Jasmine 测试随机失败

angular - 加载第二个组件导致 "The template specified for component SidebarComponent is not a string"

javascript - 无法运行 Node.js 应用程序,因为 : 'Failed to lookup view "error"in views directory'