angular 11 中代码“$event.target.checked”的问题
issue in code "$event.target.checked" in angular 11
在我的代码中使用这个例子:https://stackblitz.com/edit/angular-rskaug?file=src%2Fapp%2Fapp.component.html
Html 组件
<td><input type="checkbox" (change)="onChange(employee.id, $event.target.checked)"></td>
组件中的打字稿
onChange(id: any, isChecked: boolean) {
const idFormArray = <FormArray>this.myForm.controls.employeeRelatedId;
if (isChecked) {
idFormArray.push(new FormControl(id));
} else {
let index = idFormArray.controls.findIndex(x => x.value == id)
idFormArray.removeAt(index);
}
}
错误详情
属性 'checked' 在类型 'EventTarget' 上不存在。
45 <input type="checkbox" (change)="onChange(employee.id, $event.target.checked)">
$event.target
是泛型类型 EventTarget
。 TypeScript 不够智能,无法识别事件将由输入触发且实际类型为 HTMLInputElement
。你可以做这样的改变来克服它:
<td><input type="checkbox" (change)="onChange(employee.id, $event.target)"></td>
onChange(id: any, target: EventTarget | null) {
const input = target as HTMLInputElement;
const idFormArray = <FormArray>this.myForm.controls.employeeRelatedId;
if (input.checked) {
idFormArray.push(new FormControl(id));
} else {
let index = idFormArray.controls.findIndex(x => x.value == id)
idFormArray.removeAt(index);
}
}
鉴于模板中已经有一个响应式表单,我不确定为什么这个 input
不是它的一部分。然后你可以使用类似表单组的 valueChanges
observable 来监听它的事件。
话虽如此,您可以尝试多种快速修复方法。
选项 1:模板引用变量
您可以在 <input>
元素中使用 template reference variable 并在事件处理程序的参数中捕获它的 checked
属性。
<input type="checkbox" #inputBox (change)="onChange(employee?.id, inputBox?.checked)">
这里的#inputBox
是模板引用变量
选项 2:禁用类型检查
您可以使用模板中的 $any()
函数禁用类型检查。
<input type="checkbox" (change)="onChange(employee?.id, $any($event.target)?.checked)">
安全导航运算符 ?.
用于避免潜在的 possibly undefined
错误。
更新:工作示例
工作示例:Stackblitz
在我的代码中使用这个例子:https://stackblitz.com/edit/angular-rskaug?file=src%2Fapp%2Fapp.component.html
Html 组件
<td><input type="checkbox" (change)="onChange(employee.id, $event.target.checked)"></td>
组件中的打字稿
onChange(id: any, isChecked: boolean) {
const idFormArray = <FormArray>this.myForm.controls.employeeRelatedId;
if (isChecked) {
idFormArray.push(new FormControl(id));
} else {
let index = idFormArray.controls.findIndex(x => x.value == id)
idFormArray.removeAt(index);
}
}
错误详情
属性 'checked' 在类型 'EventTarget' 上不存在。
45 <input type="checkbox" (change)="onChange(employee.id, $event.target.checked)">
$event.target
是泛型类型 EventTarget
。 TypeScript 不够智能,无法识别事件将由输入触发且实际类型为 HTMLInputElement
。你可以做这样的改变来克服它:
<td><input type="checkbox" (change)="onChange(employee.id, $event.target)"></td>
onChange(id: any, target: EventTarget | null) {
const input = target as HTMLInputElement;
const idFormArray = <FormArray>this.myForm.controls.employeeRelatedId;
if (input.checked) {
idFormArray.push(new FormControl(id));
} else {
let index = idFormArray.controls.findIndex(x => x.value == id)
idFormArray.removeAt(index);
}
}
鉴于模板中已经有一个响应式表单,我不确定为什么这个 input
不是它的一部分。然后你可以使用类似表单组的 valueChanges
observable 来监听它的事件。
话虽如此,您可以尝试多种快速修复方法。
选项 1:模板引用变量
您可以在 <input>
元素中使用 template reference variable 并在事件处理程序的参数中捕获它的 checked
属性。
<input type="checkbox" #inputBox (change)="onChange(employee?.id, inputBox?.checked)">
这里的#inputBox
是模板引用变量
选项 2:禁用类型检查
您可以使用模板中的 $any()
函数禁用类型检查。
<input type="checkbox" (change)="onChange(employee?.id, $any($event.target)?.checked)">
安全导航运算符 ?.
用于避免潜在的 possibly undefined
错误。
更新:工作示例
工作示例:Stackblitz