javascript - Angular 6 - 单击事件绑定不适用于复选框
问题描述
我正在使用反应形式向用户显示英雄列表,并希望在用户通过单击复选框选择英雄时触发控制台日志。
所以,问题是当我在控制台中打印 this.form 时,我得到了正确的值,但是当我打印 this.form.value 时,我得到了先前状态的值。
选择 1 个英雄时的屏幕截图
As you can see, when 1 hero is selected, this.form is printing the correct values but this.form.value is printing the previous state, ie when no values were selected.
选择2英雄时的截图
2个英雄也一样。显示以前状态的结果,即选择1英雄时。
相同的代码如下。
<div class="lists">
<form [formGroup]="form" (submit)="select()">
<ul formArrayName="assets" class="heroes p-2">
<li class="p-2" *ngFor="let asset of form.controls.assets.controls; let i = index"
[class.selected]="hero === selectedHero"
(click)="select()">
<input type="checkbox" [formControlName]="i">
{{heroes[i].name}}
</li>
</ul>
<button>submit</button>
</form>
</div>
组件.ts
import { Component, OnInit } from '@angular/core';
import { FormBuilder, FormGroup, FormArray, FormControl, ValidatorFn } from '@angular/forms';
import { of } from 'rxjs';
@Component({
selector: 'app-commands',
templateUrl: './commands.component.html',
styleUrls: ['./commands.component.scss']
})
export class CommandsComponent implements OnInit {
form: FormGroup;
selectedHero;
heroes = [
{ id: 11, name: 'Dr Nice', isChecked: false },
{ id: 12, name: 'Narco', isChecked: false },
{ id: 13, name: 'Bombasto', isChecked: false },
{ id: 14, name: 'Celeritas', isChecked: false },
{ id: 15, name: 'Magneta', isChecked: false },
{ id: 16, name: 'RubberMan', isChecked: false },
{ id: 17, name: 'Dynama', isChecked: false },
{ id: 18, name: 'Dr IQ', isChecked: false },
{ id: 19, name: 'Magma', isChecked: false },
{ id: 20, name: 'Tornado', isChecked: false },
];
constructor( private formBuilder: FormBuilder,) {
this.form = this.formBuilder.group({
assets: new FormArray([])
});
this.addCheckboxes();
}
ngOnInit() {
}
private addCheckboxes() {
this.heroes.forEach((o, i) => {
const control = new FormControl();
(this.form.controls.assets as FormArray).push(control);
});
}
select() {
console.log(this.form);
console.log(this.form.value);
}
onSelect(hero): void {
this.selectedHero = hero;
}
}
请帮忙。
解决方案
似乎在更新表单对象之前执行了“单击”事件处理程序。如另一个答案所示,“更改”事件处理程序将按预期更新表单。
混乱是由浏览器控制台中表单对象的可视化引起的。当您记录 this.form 时,您会看到其属性及其最新值。当您记录 this.form.value 时,您将获得该属性的当前值,这是它在记录时的实际值。
推荐阅读
- javascript - Angular Firestore 根据条件更改此查询
- objective-c - 如何以编程方式在屏幕上应用滤色器?
- angular - 如何为订阅回调编写单元 - Jasmine / Angular
- c++ - 错误:将“unsigned long”类型的引用绑定到“const unsigned long”类型的值删除“const”限定符
- c++ - 编写一个 C++ 程序以乱序打印字符串的字母
- powerbi - 基于列值格式化矩阵的条件度量的 DAX 语法?
- python - 在 setter 和 @property 装饰器中遇到一些麻烦和混乱,并非所有在 `__init__` 中定义的属性都已更新
- flutter - Flutter Provider 在 initState() 中返回 null
- azure - 创建 Azure Function App 时未找到 ARM 模板存储帐户
- python - 在 Django 中保存原始 SQL 查询的最佳方法