Angular *ngIf监视可观察到的更改并重新创建/重新渲染子项时出现问题

Angular *ngIf监视可观察到的更改并重新创建/重新渲染子项时出现问题,angular,rxjs,Angular,Rxjs,我有一个组件,它正在监视可观察返回对象的变化,以完成子级重新渲染 所以我有类似于下面的东西 <ng-container *ngIf="someobject | async"> <child [someobject]="someobject"> </ng-container> 我对将值更改渲染到子对象没有问题,但是如果值从true切换到false,则只有重新渲染子对象才有方法在对象值更改时强制重新渲染。因为我试图避免使用onPush更改检测的哑组

我有一个组件,它正在监视可观察返回对象的变化,以完成子级重新渲染

所以我有类似于下面的东西

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

我对将值更改渲染到子对象没有问题,但是如果值从true切换到false,则只有重新渲染子对象才有方法在对象值更改时强制重新渲染。因为我试图避免使用onPush更改检测的哑组件的
ngOnChanges
中的逻辑

更新--

我正在寻找一个完整的重新渲染/重新创建,即destory->create的孩子在这里 输入更改

斯塔克布里兹演示
stackblitz.com/edit/angular-tfxc6f

您的子组件输入绑定上似乎缺少异步管道,或者您是否有可观察的输入绑定

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


否则,您可以使用传统的
$
符号作为observable的前缀,并执行类似于
*ngIf=“someobject$| async as someobject”
的操作。然后,您可以在子对象上传递对象,而不使用异步管道。

我认为使用默认的
*ngIf
指令是不可能的,因为如果在
*ngIf
指令实现中看到,一旦定义了viewRef,它就会缓存它,这就是您无法重新呈现模板的原因。请参阅角回购

解决方案:您可以创建自己的structural指令,在该指令中,您不希望缓存viewRef并始终或在您喜欢的任何条件下重新渲染。 供你参考


谢谢

这应该是可以实现的黑客攻击
*ngFor
,而不是
*ngIf

this.someObjectAsArray = this.someobject.pipe(map(x => [x]));

someTrackingFn = // put something appropriate here


为什么需要重新渲染整个组件?在异步管道中使用
ngIf
与普通管道相同,但使用可观察值时,仅当对象为false、未定义、null等时才会为false。如果某个对象从一个truthy值更改为另一个truthy值,则不会重新渲染,这不是我想知道的,我只是问你为什么需要重新渲染整个组件,告诉你这是不可能的,因为通常当你需要重新渲染整个对象时,这是一个糟糕的设计问题。更新我的问题以澄清无论如何我不明白你为什么需要销毁一个组件,重新创建组件,你有一个可观察的输入参数,它会更新,尽管你使用
onPush
,这就是使用可观察对象的方法。我认为自定义指令是一种方法
<ng-container *ngFor="let obj of (someObjectAsArray | async); trackBy: someTrackingFn">
     <child [someobject]="obj">
</ng-container>