我有一个组件正在监视可观察到的返回对象的变化,以完整地渲染子对象
所以我有类似下面的内容
<ng-container *ngIf="someobject | async">
<child [someobject]="someobject">
</ng-container>
我将值更改呈现给子对象没有问题,但是*ngIf
仅在值从true切换为false时才重新渲染子对象,是否有方法可以在某些对象值更改时强制进行重新渲染。因为我尝试避免在ngOnChanges
中使用onPush更改检测的哑组件中的逻辑
更新-
我正在寻找全部重新渲染/重新创建,即目标->在此处创建子对象 输入更改
stackbliz进行演示 stackblitz.com/edit/angular-tfxc6f
答案 0 :(得分:2)
我认为默认的*ngIf
指令是不可能的,因为如果您在*ngIf
指令实现中看到它,则会在定义了viewRef后将其缓存,这就是您无法执行此操作的原因重新呈现您的模板。请在角度仓库中参考此line。
解决方案 :您可以创建自己的结构指令,在该结构指令中,您不希望缓存viewRef并始终或在任何可能的条件下重新渲染。 Working Stackblitz供您参考。
谢谢
答案 1 :(得分:2)
应该可以实现对*ngFor
的黑客攻击,而不是*ngIf
:
this.someObjectAsArray = this.someobject.pipe(map(x => [x]));
someTrackingFn = // put something appropriate here
<ng-container *ngFor="let obj of (someObjectAsArray | async); trackBy: someTrackingFn">
<child [someobject]="obj">
</ng-container>
答案 2 :(得分:0)
似乎您的子组件输入绑定上缺少异步管道,或者您是否有可观察的输入绑定?
<ng-container *ngIf="someobject | async">
<child [someobject]="someobject | async"></child>
</ng-container>
否则,您可以在可观察对象的前面加上常规的$
符号,然后执行类似*ngIf="someobject$ | async as someobject"
的操作。然后,您可以在子对象上没有异步管道的情况下传递对象。