angular - Angular 是否会记住内联 *ngIf 条件语句?
问题描述
Angular 是否会记住内联 *ngIf 条件语句?如果我有例如:
<form [formGroup]="form" *ngIf="inputModels.length < 200">
每次更改检测运行时都会重新计算“inputModels.length < 200”,还是将其存储到 inputModel 更改?
解决方案
是的,Angular 会为您解决这个问题!
这种机制之所以有效,是因为 Angular 会为每个组件生成一个factory
。
组件工厂主要由编译器通过模板解析生成的视图节点组成。
由于工厂组件是一个很大的话题,我将只停留在这个函数上:updateRenderer
updateRenderer
需要时注意更新组件的 DOM 。
默认情况下,每个组件都添加到一个TreeRenderList
对象数组中。Angular 将该数组用于很多事情。在我个人看来,最重要的两个特征是这两个:
- 更新组件的 DOM。
- 当组件改变时更新组件的绑定
当组件更改时更新组件的绑定,这是什么意思?
让我们举一个简单的例子来解释这一点。
export class AppComponent {
@Input() myInput: string;
}
<p>{{myInput}}
我们知道每次myInput
更改我们都会看到相关 html 中的更改(默认情况下)。这有效,因为TreeRenderList
andupdateRenderer
功能。
我可以阻止 Angular 更新组件的 DOM 吗?
是的!这很容易。如果我们使用 cli ( ng g c component-name
) 生成一个组件,它的装饰器将是这样的:
@Component({
selector: 'my-component',
templateUrl: 'xxx.component.html',
styleUrls: ['xxx.component.css'],
})
但是我们可以指定很多属性。其中之一是changeDetection
。
默认情况下,Angular 使用该Default
策略,这意味着框架将决定如何以及何时更新组件的 DOM。
我们可以将其更改为OnPush
. 通过这样做,我们告诉 Angular 它不需要在其逻辑上更新组件的 DOM。将此属性添加到装饰器,结果如下:
@Component({
changeDetection: ChangeDetectionStrategy.OnPush,
selector: 'my-component',
templateUrl: 'xxx.component.html',
styleUrls: ['xxx.component.css'],
})
如果我们现在尝试更新@Input
,我们将看不到任何更改。这就是ChangeDetectionRef
我们提供帮助的地方。为了使用它,我们需要将inject
它放入组件中,我们可以使用它this.changeDetectionRef.detectChanges()
以编程方式告诉 Angular 更新组件的 DOM。
我在这里写了一个深入的指南ChangeDetectionRef
,如果你想阅读它:https ://medium.com/@sciampi.jacopo/angular-performances-a-guide-to-change-detection-b8a02c0b7b00
推荐阅读
- confluent-platform - k3s 和 kafka 网络——端口因某种原因被阻塞
- flask - 使用 flask-restx 进行 API 响应的 Swagger 文档
- apache-spark - Spark Graphx 从所有连接的节点创建图形
- reactjs - 使用 React SPA 和 Django 登录表单上的 CSRF 问题
- python - 我可以执行存储在 python 字典中的变量中的函数吗?
- c# - .Net 小数精度与 0 刻度的 SQL Server 列精度不匹配
- spring - OneToMany Jpa 在更新父表时不断在子表中插入重复项
- r - 在 R Shiny 中,可以在条件面板中使用多个条件吗?
- python - 如何使用 pandas 将列中的匹配值转换为字典
- vertex-shader - OpenGL es:在顶点着色器中“剔除”的最佳方式