此问题通常出现在使用ngModel进行双向数据绑定时。原因是在值的更改时,Angular会使模板和控制器值同步。因此,Setter在模板更改值时被调用,Setter在控制器更改值时也被调用。
解决方法是使用Angular提供的特殊指令“ngModelChange”。它可以捕获使用ngModel时的值更新并且只会在控制器中的值更改时调用Setter。示例代码如下:
组件代码:
@Component({ selector: 'app-custom-input', templateUrl: './custom-input.component.html', }) export class CustomInputComponent { private _value: string = '';
get value(): string { return this._value; }
@Input() set value(value: string) { console.log("Setter called!!!", value); this._value = value.toUpperCase(); }
onInputChange($event: any) { this.value = $event.target.value; }
onInputBlur() { this.ngModelChange.emit(this.value); }
@Output() ngModelChange: EventEmitter
组件模板代码:
在上面的代码中,ngModelChange事件是使用EventEmitter创建的,只要在控制器中的值更改时就会发生。在onInputBlur方法中,ngModelChange被发射其中包含控制器中的当前值。这样,你就可以避免Setter被调用两次的问题。
上一篇:Angular中双向绑定不起作用