角度:使用 setter vs 使用 ngModelChange 更新另一个字段(绑定到 getter,setter



我有两个字段 - 一个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 实际上是不好的。很少有论据是——

  1. 使用 getter 而不是直接绑定到实例成员可能会影响性能(角度变化检测的行为可能有所不同?

  2. 如果我们继续鼓励使用 getters setter,你很容易通过 getter/setter 中放置一些逻辑来滥用它,最终可能会导致 UI 中的数据和实际模型数据不同步(这也会导致 ExpressionChangedAfterItHasBeenCheckedError 错误(,所以最好坚持使用方法 #b

你有什么意见?,角度应用应该坚持方法 #b 吗?

提前谢谢。

只要不绑定到它们,就可以使用它们(您始终可以绑定到支持字段(。angular关于getter和setter的变化检测的问题在于它们实际上是函数,因此变化检测机制必须在每个周期运行它们以检查是否有变化。

实际上,使用角度的二传手可以提高性能。

这是通过设置组件来完成的

@Component({
  // ...
  changeDetection: ChangeDetectionStrategy.OnPush
})

并在资源库中运行ChangeDetectorRef更改检测。

但这有点先进,需要一些关于更改检测系统的知识才能正确使用它,并且这种方法会影响所有组件的子组件,因此实际上可能会弄乱第三方组件。

我只是在这里提到它,以防您在项目中达到一切都开始显着减慢的地步

最新更新