我正在开发 angular2 应用程序,我的团队成员正在使用 getter 和 setter 来设置输入属性,如下所示
private _showModal;
@Input() set showModal(showModal){
this._showModal = showModal;
}
get showModal() {
return this._showModal;
}
但我不确定这样做的好方法。我认为在开发人员必须在设置或获取值时进行一些验证或检查或执行其他功能的情况下应该使用 getter setter
我们在哪里进行阅读(
get
)和写作(get
)主要决定了我们为性能付出多少成本。
set
ters每次我们写一些值时都会调用
set
ter函数。
现在我们通常会在我们的 TypeScript 类中调用
set
ter 的编写部分。因此,除非有set
操作,否则他们不会经常被调用,这通常不是很频繁。
get
tersget
ter 函数在每次我们读取一些值时被调用。
get
ter通常在模板中以不同的数据绑定语法调用,如字符串插值({{}}
),属性绑定([---]=""
),属性绑定([attr.---]=""
),样式绑定([style.---]=""
)等
现在的问题是,每次 Angular 执行变更检测时,
get
ter 都会被调用。只要你的 get
ter 没有太多逻辑就可以了。但这仍然为团队中的新开发人员留下了空间,可以在其中添加逻辑,而不会意识到它会产生性能影响。
所以总而言之,据我了解,有
set
ter是可以的。但是有get
ters和它的性能成本主要取决于这些get
ters的使用位置。如果它们在其中一种模板绑定语法中使用,那么不将它们放在首位是安全的。如果模板中没有使用它们,可以使用它们。
实际上我已经写了一篇文章和一些关于各种 StackOverflow 线程的答案,您可能也想看看。所以我将它们添加为下面的列表:
希望这能给你一些观点。 :)
如果可能的话,特别要避免吸气剂。吸气剂对变化检测有负面影响。为了知道是否应该更新视图,Angular 需要访问新值,将其与旧值进行比较,并决定是否应该更新视图。因此,在每个更改检测周期都会比较和更新该值。如果由于某种原因您需要在组件中更改 @Input() 时转换数据,例如 setter 就可以了。
value;
@Input('myValue') set myValue(v) {
transformValue(v);
}
transformValue(v) {
...*sometransform*
this.value = transforrmedValue
}
在这个例子中,一个 setter 被放置在 Input 上,每次一个新的 myValue 被推送到组件时,值都会被转换。但是,如果引入了 getter,组件将在每次更改检测循环时检查 getter。您还可以使用其他东西,例如管道或 ngOnChange 而不是设置器。
更新
只要你的组件使用 ChangedetectionStategy.OnPush 现在使用 getter 就可以了,但如果你不使用 OnPush 仍然要避免它
这部分是意见,部分是您申请的要求。使用 getter 和 setter 肯定不是坏。但我也会谨慎使用它们,在大多数情况下,getter 和 setter 可能是不必要的。
在您提供的示例代码中,没有理由使用 getter 和 setter。您是正确的,因为它可以在进行某种验证检查或根据设置的值进行其他操作等时提供帮助。例如,当
@Input()
属性更改值时,您可能需要调用一些函数,这可以是实现这一目标的简单方法。但在许多情况下,这可能不是对应用程序中每个变量/输入的要求。
希望这有帮助。
如果您在 get 或 set 中更改 _showModal,我只会这样做。
像您的团队成员一样使用它(使用支持属性)只会添加更多代码行。在那种情况下,我会创建一个公共 showModal 属性。
我不知道是否有这方面的“最佳实践”。我认为这主要与个人喜好有关。
这是一个很好的做法,因为您可以更好地控制数据。尤其是当您需要通过角度变化检测了解数据何时发生变化时。
大多数时候,我在我的服务中使用它们来在多个组件之间共享数据。
它们还与可观察对象很好地交互,以避免多次调用端点来获取数据。