BehaviorSubject、asyncpipe和*ngIf的奇怪行为:ngOnChanges接收到理论上不可能的变化。
创始人
2024-11-28 02:30:11
0

问题的原因在于使用 *ngIf 来将 BehaviorSubject 和 async pipe 在组件中合并使用时,会导致组件的变化检测出现问题。解决方法是使用 ng-container 来代替 *ngIf 对 BehaviorSubject 进行订阅,然后再使用 async pipe 进行数据的展示,如下所示:

组件:

@Component({ selector: 'app-test', template:

{{ show.title }}

{{ show.content }}

, }) export class TestComponent implements OnInit, OnChanges { @Input() id: number; show$ = new BehaviorSubject<{ title: string; content: string }>({ title: '', content: '' });

ngOnInit() { this.getData(this.id); }

ngOnChanges(changes: SimpleChanges) { if (changes['id']) { this.getData(this.id); } }

getData(id: number) { // 根据 id 获取数据,如下为模拟数据 this.show$.next({ title: title-${id}, content: content-${id} }); } }

父组件:

@Component({ selector: 'app-parent', template: , }) export class ParentComponent { id = 1; constructor(private cdr: ChangeDetectorRef) {}

changeId() { this.id = 2; // 手动触发变化检测 this.cdr.detectChanges(); } }

在上述代码中,我们使用了 ng-container 标签来代替 *ngIf 对 BehaviorSubject 进行订阅,再使用 async pipe 进行数据的展示。这样就可以避免订阅的问题,同时使用 ChangeDetectorRef 的 detectChanges 方法可以手动触发变化检测,从而解

相关内容

热门资讯

6分钟辅助!来玩app破解版,... 6分钟辅助!来玩app破解版,wepoker辅助器免费,方针教程(有挂细节)1、在wepoker辅助...
五分钟辅助!模拟器打开hhpo... 五分钟辅助!模拟器打开hhpoker,hhpoker辅助器,教程书教程(竟然有挂)1、下载好模拟器打...
六分钟辅助!来玩app破解,德... 六分钟辅助!来玩app破解,德州局脚本,方式教程(有挂教程)1、进入到德州局脚本是否有挂之后,能看到...
第三分钟辅助!约局吧是否有挂,... 第三分钟辅助!约局吧是否有挂,wepoker黑侠破解,经验教程(有挂解密)该软件可以轻松地帮助玩家将...
6分钟辅助!aapoker免费... 6分钟辅助!aapoker免费透视脚本,德州透视是真的假的,指引教程(有挂教学)德州透视是真的假的辅...
第六分钟辅助!hhpoker外... 第六分钟辅助!hhpoker外挂靠谱吗,aapoker安装包怎么使用,绝活儿教程(有挂细节)1、让任...
三分钟辅助!poker辅助器免... 三分钟辅助!poker辅助器免费安装,pokemmo手机版透视脚本,模块教程(有挂细节)亲,关键说明...
第九分钟辅助!sohoopok... 您好,wepoker透视脚本苹果版这款游戏可以开挂的,确实是有挂的,需要了解加去威信【4852750...
第四分钟辅助!破解辅助插件we... 第四分钟辅助!破解辅助插件wepoker,wepoker辅助分析器,项目教程(有挂分析)1、每一步都...
9分钟辅助!聚星ai辅助工具收... 9分钟辅助!聚星ai辅助工具收费多少,we poker插件,举措教程(确实有挂)聚星ai辅助工具收费...