在 Angular 4+ 中绑定到属性/函数与变量是否很糟糕?

Posted

技术标签:

【中文标题】在 Angular 4+ 中绑定到属性/函数与变量是否很糟糕?【英文标题】:Is it bad to bind to properties/functions vs variables in Angular 4+?在 Angular 4+ 中绑定到属性/函数与变量是不是很糟糕? 【发布时间】:2020-01-27 09:48:18 【问题描述】:

我试图了解绑定到角度模板中的函数与绑定到变量/表达式是否是一种不好的做法。有什么区别吗?

例如:

选项 1

<span *ngIf="!!myForm.value && !!myform.errors && !!myForm.errors['required']" ...

选项 2

html
<span *ngIf="requiredError" ...

TS
get requireError() 
    return !!this.myForm.value && !!this.myform.errors && !!this.myForm.errors['required'];

据我了解没有区别,两个表达式都将继续执行,在这种情况下,我总是选择选项 2。但是,我一直被告知属性/函数绑定是不好的,因为 Angular 添加了一个观察者和函数一直在执行。我的理解是,选项 1 也是如此。我非常感谢一些描述此问题的文章或文档链接,在网上找不到太多内容。

具体来说,当使用有效的、触摸的、脏的(在 Angular 中已经是 get 属性)时,我看不出它会有什么不同,除非 Angular 以某种方式神奇地处理这些不同。

我看到风格指南有一个简短的提及:https://angular.io/guide/styleguide#put-presentation-logic-in-the-component-class

【问题讨论】:

检查这个:“为什么你不应该在 Angular 模板表达式中使用函数调用”,作者 Jurgen Van de Moere link.medium.com/gqzy8N1Gj0 【参考方案1】:

为了在全局范围内回答您,在 Angular 中,您拥有在每次更改检测运行时都会评估的模板表达式(以将当前值与新值进行比较,并了解 DOM 是否需要更新)。

例子:

<span *ngIf="expression"></span>
<div> expression </div>
<div [class.myclass]="expression"></div>

您的表达式可以包含变量或函数调用,它对调用频率或性能的角度没有任何影响:

myBoolean1 = true;
myBoolean2 = false;
<span *ngIf="myBoolean1 && !myBoolean2"></span>

等同于:

myBoolean1 = true;
myBoolean2 = false;

getValue(): boolean 
    return this.myBoolean1 && !this.myBoolean2;

<span *ngIf="getValue()"></span>

(更改检测运行的时间和原因是另一个主题)

但是,在模板中使用函数调用被认为是一种不好的做法,因为通常,当团队处理代码库时,人们倾向于在这些函数中添加越来越多的计算,这会逐渐导致全局性能问题。

【讨论】:

我有一个非常相似的例子,当我将一个函数绑定到模板中的一个属性时,它会被连续调用。当我将一个变量绑定到模板中的属性并在 ts 文件中的 ngInit 中设置该变量时,该函数只被调用一次。这是预期的行为吗?【参考方案2】:

我的意见,我觉得这样更好:

HTML:

<span *ngIf="isError"></span>

TS:

ngOnInit() 
   this.isError = this.requireError();

为什么?因为这里的函数只会被请求一次。 在你的版本中,第一个变体是合适的,但是模板中会有很多垃圾。在第二个变体中,函数可能会被多次请求。

【讨论】:

没关系,但是您如何查看更改以便在我们收到表单错误isError 时更新?您必须手动触发更新

以上是关于在 Angular 4+ 中绑定到属性/函数与变量是否很糟糕?的主要内容,如果未能解决你的问题,请参考以下文章

Angular2:条件显示,绑定到 [hidden] 属性与 *ngIf 指令 [重复]

Angular 4.x - 无法绑定到“ngModel”,因为它不是“输入”的已知属性

Angular 2从服务访问组件变量,即绑定到另一个服务,该服务绑定到组件

Angular js绑定标题属性

Angular 4 无法绑定到 <property> 因为它不是 <component> 的已知属性

Angular2 - 组件变量/组件类属性的两种方式数据绑定?