javascript - 如何检查 Angular2(输入)处理程序中的值是否确实发生了更改

标签 javascript angular angular-ngmodel event-binding

如果输入字段的 ngModel 发生更改,我想在 Angular2 组件中运行一些代码。 我想监听 (input) 事件,因为它会在任何类型的用户交互上触发。这意味着我无法在此处使用 (change) 事件。 我只想在值发生变化时运行我的代码。

这是一个示例组件:

import { Component } from '@angular/core';

@Component({
    selector: 'myCuteComponent',
    templateUrl: `
        <h1>yoO World</h1>
        <input [(ngModel)]="cuteValue" (input)="onInput($event)">
    `
})
export class MyCuteComponent {

    cuteValue = '';

    constructor() { }

    onInput(event) {
        if (event.target.value !== this.cuteValue) {
            console.log('value has changed'); // this will never run :(
        }
    }
}

问题在于,当 onInput 被触发时,event.target.value 已经包含新值。所以这种方式行不通,console.log 将永远不会运行。

问题:是否有适当的(且通用的)解决方案来检测在任何类型的用户交互后值是否确实发生了变化?

最佳答案

试试这个:

import { Component} from '@angular/core';

@Component({
    selector: 'myCuteComponent',
    templateUrl: `
        <h1>yoO World</h1>
        <input [(ngModel)]="cuteValue" (ngModelChange)="onInput($event)">
    ` }) export class MyCuteComponent {

    onInput(value) {
        console.log(value);
    }
}

ControlValueAccessors 将使用方括号写入初始值,并使用香蕉括号发出值更改。因此 [ngModel] 和 (ngModelChange) 被缩短为 [(ngModel)] 以绑定(bind)并发出更改。

关于javascript - 如何检查 Angular2(输入)处理程序中的值是否确实发生了更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41030046/

相关文章:

javascript - 这行 Javascript Regex 的作用是什么?

javascript - 为什么 _.merge 中的第一个对象会更新为当前值?

javascript - 如何在 snapshot.foreach 中访问超出其范围的变量值

javascript - 无法读取未定义的属性 'Push' - Typescript

angularjs - 为什么我的指令中的 ctrl 为空?

javascript - 默认为动态生成的 'Select' 框选择第一个值

javascript - 如何在 Angular 中动态替换值?

angular - 在 *ngFor-- IONIC2/Angular2 中迭代两个数组

angularjs - 如何使用html部分中的表达式更新ng-model的值

javascript - Angular 怪异 : how can one object attribute change an attribute on two different objects?