Angular未指定ngModelChange时,是否存在隐式ngModel变更处理器?
关于Angular [(ngModel)]自动调用约定方法的疑问解答
你确实记错了——Angular原生的[(ngModel)]双向绑定没有自动调用字段名+Change方法的约定。
[(ngModel)]的本质
[(ngModel)]是[ngModel]="foo"(组件数据流向模板)和(ngModelChange)="onFooUpdate($event)"(模板事件流向组件)的语法糖,只有显式绑定(ngModelChange)事件时,才会触发你指定的处理器方法。
你尝试的这种写法:
// 组件代码 foo: number; fooChange($event) { /* 逻辑处理 */ }
<!-- 模板代码 --> <input [(ngModel)]="foo" />
Angular不会自动识别fooChange方法并调用,因为原生表单控件的ngModelChange事件需要显式绑定才能生效,不存在“按字段名约定自动关联”的机制。
容易混淆的场景
你可能把自定义组件的双向绑定机制和原生ngModel搞混了:
如果是自定义组件,我们可以通过@Output()定义一个和输入属性同名+Change的事件,比如:
@Component({ selector: 'app-custom-input', template: '<input (input)="onInput($event.target.value)">' }) export class CustomInputComponent { @Input() foo: number; @Output() fooChange = new EventEmitter<number>(); onInput(value: string) { this.fooChange.emit(Number(value)); } }
这时候在父组件里使用[(foo)]="parentFoo"的双向绑定语法,Angular会自动把parentFoo的更新和子组件的fooChange事件关联起来,这是自定义组件双向绑定的约定,但这和原生表单控件的[(ngModel)]不是一回事。
总结
原生表单控件的[(ngModel)]必须显式绑定(ngModelChange)才能触发对应的方法,不存在自动调用字段名+Change方法的特性,你之前的记忆是错误的。
内容的提问来源于stack exchange,提问作者Green Grasso Holm
相关产品推荐
相关产品推荐

