我有两个字段 - 一个html选择控件和一个文本输入控件。在选择控件中选择选项后,应清除文本输入并使用默认值进行更新(用户仍然可以对其进行编辑(。
有两种方法可以做到这一点——
a. 使用 setter & getter
<select [(ngModel)]="selectedItem ">
<option value="one">One</option>
...
</select>
<input [(ngModel)]="textValue">
textValue: string;
get selectedItem(): string {
return _selectedItem;
}
set selectedItem(value: string) {
this._selectedItem = value;
this.textValue = some-default-value;
}
b. 使用 ngModelChange
<select [(ngModel)]="selectedItem " (ngModelChange)="onSelectionChange($event)">
<option value="one">One</option>
...
</select>
<input [(ngModel)]="textValue">
textValue: string;
selectedItem: string;
public onSelectionChange() {
this.textValue = some-default-value;
}
我个人喜欢方法 #a(看起来更像 MVVM 而不是 #2 中的事件驱动 Winforms(,但我听说在角度世界中使用 getter 和 setter 实际上是不好的。很少有论据是——
使用 getter 而不是直接绑定到实例成员可能会影响性能(角度变化检测的行为可能有所不同?
如果我们继续鼓励使用 getters setter,你很容易通过 getter/setter 中放置一些逻辑来滥用它,最终可能会导致 UI 中的数据和实际模型数据不同步(这也会导致 ExpressionChangedAfterItHasBeenCheckedError 错误(,所以最好坚持使用方法 #b
你有什么意见?,角度应用应该坚持方法 #b 吗?
提前谢谢。
实际上,使用角度的二传手可以提高性能。
这是通过设置组件来完成的
@Component({
// ...
changeDetection: ChangeDetectionStrategy.OnPush
})
并在资源库中运行ChangeDetectorRef
更改检测。
但这有点先进,需要一些关于更改检测系统的知识才能正确使用它,并且这种方法会影响所有组件的子组件,因此实际上可能会弄乱第三方组件。
我只是在这里提到它,以防您在项目中达到一切都开始显着减慢的地步