Angular 角度-AfterViewInit发出新值时异步管道不更新视图
我有一个简单的组件,它包含一个Angular 角度-AfterViewInit发出新值时异步管道不更新视图,angular,typescript,Angular,Typescript,我有一个简单的组件,它包含一个行为主题。在我的模板中,我使用async管道更新视图,并从我的BehaviorSubject获取最新值 当值从OnInit生命周期挂钩发出时,async管道将使用正确的值更新视图。但是当我尝试从AfterViewInit发出一个值时,async管道不会更新视图 这是正确的行为吗?为什么async管道不会更新第二个发出的值 示例组件: @组件({ 选择器:“应用程序示例”, templateUrl:'./example.component.html', changeD
行为主题
。在我的模板中,我使用async
管道更新视图,并从我的BehaviorSubject
获取最新值
当值从OnInit
生命周期挂钩发出时,async
管道将使用正确的值更新视图。但是当我尝试从AfterViewInit
发出一个值时,async
管道不会更新视图
这是正确的行为吗?为什么async
管道不会更新第二个发出的值
示例组件:
@组件({
选择器:“应用程序示例”,
templateUrl:'./example.component.html',
changeDetection:ChangeDetectionStrategy.OnPush
})
导出类ExampleComponent实现OnInit,AfterViewInit{
公共测试$=新行为主体(0);
构造函数(公共cd:ChangeDetectorRef){
//所有三个值都被记录-0、100、200
这个.test$.subscribe(console.log);
}
恩戈尼尼特(){
//视图更新为100值
此.test$.next(100);
}
ngAfterViewInit(){
//视图未更新,异步管道未触发
此.test$.next(200);
}
}
组件模板示例:
{{test$| async}
您正在使用OnPush
更改检测策略。您应该手动触发更改检查:
ngAfterViewInit(){
//视图未更新,异步管道未触发
此.test$.next(200);
this.cd.detectChanges();
}
在检查视图之前,将调用ngOnInit。因此,首先将显示100
ngAfterViewInit
在对视图进行初始检查后调用。由于您使用的是OnPush
更改检测策略,因此它不会自动触发更改。为什么我必须手动执行此操作,并且视图不会通过async
管道自动更新?新值被发出,因此我认为视图将通过async
管道更新。从docs—“当发出一个新值时,异步管道会标记要检查的组件的更改。”changeDetection:ChangeDetectionStrategy.OnPush
-因此