如何在输入[Angular]时检测输入字段中的变化
我是新手。我正在尝试一些简单的事情。我有一个输入字段。我只想检测变化。每当我输入字段时,我想调用一些代码。我检查了这些文章: 这是我的密码: my component.component.html如何在输入[Angular]时检测输入字段中的变化,angular,typescript,onchange,Angular,Typescript,Onchange,我是新手。我正在尝试一些简单的事情。我有一个输入字段。我只想检测变化。每当我输入字段时,我想调用一些代码。我检查了这些文章: 这是我的密码: my component.component.html <input [(ngModel)]="text"> <input [(value)]="text" (change)="onChange($event)"> 两个重要信息: 我也试过了DoCheck,但这不是我想要的。我想看看是否只更改了输入字段的值。但是ngDo
<input [(ngModel)]="text">
<input [(value)]="text" (change)="onChange($event)">
两个重要信息:
DoCheck
,但这不是我想要的。我想看看是否只更改了输入字段的值。但是ngDoCheck
在其余组件中的每一个细微更改之后都会被调用,因为它使用的是zone.js
(我在某个地方读过)(keydown)
,因为我想稍后实现验证代码。我希望在输入时进行验证。但使用keydown时,我注意到即使在输入的值有效(比如日期/时间)之后,我也必须通过一些按键来触发验证代码input()
:
示例:
HTML:
<input [(ngModel)]="text" (input)="sendTheNewValue($event)">
在您的示例中:
HTML:
这两项更改是跟踪输入更改所必需的:
<input [(ngModel)]="text">
<input [(value)]="text" (change)="onChange($event)">
Angular本身处理更改检测。当它发生时,你只需要进入逻辑。在大多数情况下,这比使用eventlisteners更可取,eventlisteners由本线程中的大多数其他答案提出 无论何时更改输入,angular都会访问设置字符串的变量 当变量发生变化时,一种方法是使用
get
ter和set
ter
// create an internal variable (do not change manually)
private _text;
// getter function, called whenever the value is accessed
get text(){
console.log("the value was accessed")
return this._text
}
// setter function, called whenever the value is set
set text(text){
this._text = text
console.log("the value was set")
}
我还编辑了你的stackblitz,包括一个例子。
其他一切都是一样的。你只需要在文本上使用ngModel
<input [(ngModel)]="text">
我认为以上所有答案都是正确的。我喜欢getter setter方法,尽管它添加了几行代码。以防您想测试跟踪代码更改的第三种方法: 它使用
@ViewChildren
和订阅值更改
可观察:
export class MyComponentComponent implements AfterViewInit {
text="hello world";
second="hi angular";
@ViewChildren(NgModel) myInputRef: QueryList<NgModel>;
ngAfterViewInit() {
this.myInputRef.forEach(ref =>
ref.valueChanges.subscribe(val =>
console.log(`${ref.name}'s value changed to ${val}`)
)
);
}
}
导出类MyComponentComponent实现AfterViewInit{
text=“你好,世界”;
second=“hi angular”;
@ViewChildren(NgModel)myInputRef:QueryList;
ngAfterViewInit(){
this.myInputRef.forEach(ref=>
ref.valueChanges.subscribe(val=>
log(`${ref.name}的值更改为${val}`)
)
);
}
}
在模板中:
<input [(ngModel)]="text" name="firstInput">
<input [(ngModel)]="second" name="secondInput">
我添加了第二个输入元素,以表明如果有多个具有双向绑定的元素,则必须使用
@ViewChildren
。如果只有一个元素,则可以使用@ViewChild(NgModel)myFirstInput:NgModel代码>而且代码会更简单。我正在一个接一个地尝试所有答案,并运行单元测试用例。我会很快回来的。谢谢大家。:-)这个答案同样有效。让我把这个给我的技术主管看看。请给我一些时间接受。请解释这个答案。我将在生产代码中使用它。我可能会被技术负责人盘问。好的,(输入)
是一种检测何时将char
引入输入元素的操作,如果您尝试console.log(事件),则通过使用方法change($event)
发送事件以获取其值并根据需要使用
你会发现它是一个包含太多卑鄙信息的对象,但对我们来说重要的只是它的值,这是我们使用event.target.value时得到的。我也会向我的技术负责人展示这个解决方案。嗨,戈皮纳斯,这不是我想要的。在您的解决方案中,它将仅检测更改,并且在按下enter键时也会检测更改。但在我的情况下,我希望在打字的同时进行检测。在这里,我试过你的:或者我错过了什么。请检查stackblitz。嗨,Tanzeel,我发现文本字段中键入的每个键实际上都会触发“onchange”。事件响应发生得很好。问题似乎出在处理更改的值的验证函数(validate(sDate:string))上。此功能需要更新以满足要求。其他地方不需要改变。
<input [(ngModel)]="text">
export class MyComponentComponent implements AfterViewInit {
text="hello world";
second="hi angular";
@ViewChildren(NgModel) myInputRef: QueryList<NgModel>;
ngAfterViewInit() {
this.myInputRef.forEach(ref =>
ref.valueChanges.subscribe(val =>
console.log(`${ref.name}'s value changed to ${val}`)
)
);
}
}
<input [(ngModel)]="text" name="firstInput">
<input [(ngModel)]="second" name="secondInput">