Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 角度-AfterViewInit发出新值时异步管道不更新视图_Angular_Typescript - Fatal编程技术网

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
-因此