angular - 为什么 ngSwitch 会无限渲染模板?
问题描述
我有以下带开关的模板:
<ng-container [ngSwitch]="block.type">
<ng-container *ngSwitchCase="'block'">
<div class="requestDocumentBlock">
<div>
<ng-container *ngTemplateOutlet="children; context: { block: block }"></ng-container>
</div>
</div>
</ng-container>
<!-- Field --->
<ng-container *ngSwitchCase="'field'">
<app-request-document-field [fieldDefinition]="block"></app-request-document-field>
</ng-container>
<!-- Custom --->
<ng-container *ngSwitchDefault>
<app-request-document-field
[fieldDefinition]="block"
*ngFor="let block of documentCustomBlock?.getVisibleControls()"
></app-request-document-field>
<button (click)="setDocument()" type="button" class="btn btn-primary">Задать документ</button>
</ng-container>
</ng-container>
所以,问题出在这部分代码中:
<app-request-document-field
[fieldDefinition]="block"
*ngFor="let block of documentCustomBlock?.getVisibleControls()"
></app-request-document-field>
默认documentCustomBlock?.getVisibleControls()
为空数组。当数据到来时,它开始无限渲染整个模板。
我无法得到为什么?
更新:
组件是:
public documentCustomBlock: DocumentCustomBlock;
this.dialog
.open(DialogLoadDocumentComponent, dialogConfig)
.afterClosed()
.subscribe((documentCustomBlock: DocumentCustomBlock) => {
this.documentCustomBlock = documentCustomBlock;
this.changeDetection.detectChanges();
});
模板是:
<app-request-document-field
[fieldDefinition]="block"
*ngFor="let block of documentCustomBlock?.getVisibleControls()"></app-request-document-field>
解决方案
可能的答案:
这个会尝试只采用一个可观察的发射来更新数据
public documentCustomBlock: DocumentCustomBlock;
this.dialog
.open(DialogLoadDocumentComponent, dialogConfig)
.afterClosed()
.pipe(
take(1)
)
.subscribe((documentCustomBlock: DocumentCustomBlock) => {
this.documentCustomBlock = documentCustomBlock;
this.changeDetection.detectChanges();
});
或者
这个将使用异步管道,它会自动解析
public documentCustomBlock: DocumentCustomBlock = this.dialog
.open(DialogLoadDocumentComponent, dialogConfig)
.afterClosed();
<app-request-document-field
[fieldDefinition]="block"
*ngFor="let block of documentCustomBlock?.getVisibleControls() | async"
></app-request-document-field>
推荐阅读
- javascript - 动态元素 onclick 功能
- python - 如何在 python 中使用最少的内存使用将数据框的子选择除以另一个数据框?
- url - URL 和 request.query_string 中的空格将在输出中返回 %20
- arrays - 尝试遍历自定义类对象数组
- javascript - sendBeacon 在对请求进行排队时是否设置了 cookie 标头?
- firebase - 我如何在 heroku 上为谷歌助手部署 Firebase 功能
- php - 用于删除整个目录中起始字符和结束字符之间的所有文本的 Shell 脚本或命令
- swift - Firebase 中转到用户个人资料的自定义动态链接
- mysql - 重置 MySQL 密码 - Mac
- docker - docker-compose,我如何检查容器是否正在运行最后一个图像?并重新启动它