Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在Angular2/Typescript中不使用ngModel访问输入字段值_Javascript_Angular_Typescript - Fatal编程技术网

Javascript 在Angular2/Typescript中不使用ngModel访问输入字段值

Javascript 在Angular2/Typescript中不使用ngModel访问输入字段值,javascript,angular,typescript,Javascript,Angular,Typescript,我在Angular2中使用Typescript,就像Angular2英雄之旅教程中一样 我有一个输入字段,我想将change事件附加到该字段,以便在字段更改时可以执行一些自定义逻辑。我需要知道字段的当前值才能执行逻辑,因此我不想将该字段与ngModel绑定,因为这将在我能够检索其更改前的值之前覆盖该属性 所以我有点像: <input (change)="handleChange(myObj, $event)" value={{ myObj.myField }}... /> 虽然这在

我在Angular2中使用Typescript,就像Angular2英雄之旅教程中一样

我有一个输入字段,我想将
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)"