Javascript 在Angular2/Typescript中不使用ngModel访问输入字段值
我在Angular2中使用Typescript,就像Angular2英雄之旅教程中一样 我有一个输入字段,我想将Javascript 在Angular2/Typescript中不使用ngModel访问输入字段值,javascript,angular,typescript,Javascript,Angular,Typescript,我在Angular2中使用Typescript,就像Angular2英雄之旅教程中一样 我有一个输入字段,我想将change事件附加到该字段,以便在字段更改时可以执行一些自定义逻辑。我需要知道字段的当前值才能执行逻辑,因此我不想将该字段与ngModel绑定,因为这将在我能够检索其更改前的值之前覆盖该属性 所以我有点像: <input (change)="handleChange(myObj, $event)" value={{ myObj.myField }}... /> 虽然这在
change
事件附加到该字段,以便在字段更改时可以执行一些自定义逻辑。我需要知道字段的当前值才能执行逻辑,因此我不想将该字段与ngModel
绑定,因为这将在我能够检索其更改前的值之前覆盖该属性
所以我有点像:
<input (change)="handleChange(myObj, $event)" value={{ myObj.myField }}... />
虽然这在代码中可以正常工作,但Typescript编译器正在抛出一个错误错误TS2339:类型“EventTarget”上不存在属性“value”。
行newValue:number=parseInt(e.target.value)代码>
有更好的方法吗?Angular2事件无法直接访问事件的目标。您真的不应该通过原始元素访问您的值,您应该始终使用绑定
无论什么.component.ts
export class WhateverComponent {
private tempField: any;
private handleChange(obj: MyObjectClass, e: Event) {
obj.field = this.tempField;
}
}
whatever.component.html
<input (change)="handleChange(myObj, $event)" [value]="tempField" />
如果您确实必须访问该元素,那么就有一个类。但是,这是一个重大的安全风险,您应该注意文档中的警告:
允许直接访问DOM会使应用程序更容易受到XSS攻击。仔细检查代码中ElementRef的任何用法。有关更多详细信息,请参见
如果您看到EventTarget
的定义,如下所示
interface EventTarget {
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
dispatchEvent(evt: Event): boolean;
removeEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
}
它不包含值
属性。所以如果你想用正确的方式做,你可以使用
e.target['value']
现在,EventTarget上没有value proerty的原因可以用来支持不同类型的事件,例如,您可以对选中的输入类型使用相同的事件,在这种情况下,您希望查看选中的属性。对输入值进行验证,您最好编写一个自定义验证器,而不是尝试使用更改事件。也就是说,您可以使用对输入的引用来传递输入值,如下所示:
<input #myInput (change)="handleChange(myInput.value, $event)" value={{ myObj.myField }}... />
最简单的方法是使用官方密码。因此,它只在模板
范围内发生,根本不会影响组件
。
比如:
<input (change)="handleChange(myObj, newValue.value)" #newValue />
// Method keep the same
handleChange (obj: MyObjectClass, e: Event) {
oldValue: number = obj.myField;
newValue : number = parseInt(e.target.value);
// Do some logic
obj.myField = newValue;
}
有关HTMLInputEvent类型,请参阅。
<input (change)="handleChange(myObj, newValue.value)" #newValue />
// Method keep the same
handleChange (obj: MyObjectClass, e: Event) {
oldValue: number = obj.myField;
newValue : number = parseInt(e.target.value);
// Do some logic
obj.myField = newValue;
}
(keyup.enter)="onEnter(newvalue.value)"