Angular 按钮修改子组件输入值时父组件change事件未触发问题咨询
问题根因与解决方案
- 根因:你在Child1(app-web-panel)的模板中,监听了Child2(app-my-input-w-buttons)的
(change)事件来触发emitOnChanges(),但这个change是原生DOM事件,只有当你操作Child2内部的input元素且输入框失焦时才会触发。点击加减按钮修改value时,Child2只触发了自定义的emitterInputWButtons事件,没有向上抛出change事件,所以Child1感知不到这次值变更。
推荐解决方案:直接在Child1的自定义事件回调中触发值同步
无需新增事件,直接在getNPages和getNLanguages执行完后调用emitOnChanges()即可,逻辑更简洁:
// Child1.ts修改部分 getNPages(evt: string){ this.nPages = Number(evt); console.log("Panel:// NPages: " + this.nPages); // 新增调用,触发值同步到父组件 this.emitOnChanges(); } getNLanguages(evt: string){ this.nLang = Number(evt); console.log("Panel:// NLang: " + this.nLang); // 新增调用,触发值同步到父组件 this.emitOnChanges(); }
修改完成后可以删除Child1模板里绑定的(change)="emitOnChanges()",避免键盘修改输入时重复触发事件。
可选方案:Child2主动抛出change事件
如果需要保留(change)事件的绑定逻辑,可以修改Child2代码,在每次值变更时主动触发change事件:
// Child2.ts修改部分 @Output() change = new EventEmitter<void>(); emitValue(){ this.emitterInputWButtons.emit(String(this.value)); // 新增触发change事件 this.change.emit(); }
不管是点击按钮还是键盘修改输入,都会触发Child1绑定的(change)回调,流程即可正常走通。
小优化点
Child2的input模板中同时使用了[(ngModel)]和value="{{value}}"属于冗余写法,ngModel已经实现了双向绑定,不需要额外声明value属性。
内容的提问来源于stack exchange,提问作者Peskao909
相关产品推荐
相关产品推荐

