* ng问题如果正在观察可观察到的更改并重新创建/重新渲染子级

时间:2019-12-05 07:47:30

标签: angular rxjs

我有一个组件正在监视可观察到的返回对象的变化,以完整地渲染子对象

所以我有类似下面的内容

<ng-container *ngIf="someobject | async">
     <child [someobject]="someobject">
</ng-container>

我将值更改呈现给子对象没有问题,但是*ngIf仅在值从true切换为false时才重新渲染子对象,是否有方法可以在某些对象值更改时强制进行重新渲染。因为我尝试避免在ngOnChanges中使用onPush更改检测的哑组件中的逻辑

更新-

  

我正在寻找全部重新渲染/重新创建,即目标->在此处创建子对象   输入更改

stackbliz进行演示 stackblitz.com/edit/angular-tfxc6f

3 个答案:

答案 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"的操作。然后,您可以在子对象上没有异步管道的情况下传递对象。

相关问题