angular - 更改组件属性中的值不会触发更改检测?但是单击组件时有效吗?
问题描述
我有一个非常简单的要求。当属性值hideToolBarHeader
设置为true
使用 [ngClass] ="{'my-class': hideToolBarHeader} 隐藏工具栏标题时。传入的值来自服务。该服务如下所示:
`@Injectable({
providedIn: 'root'
})
export class HeaderService {
hideToolbarHeader$: ReplaySubject<boolean> = new ReplaySubject(1);
constructor() { }
hideToolbar(hideToolbar: boolean): void{
this.hideToolbarHeader$.next(hideToolbar);
console.log('[Inside HeaderService]');
this.hideToolbarHeader$
}
}`
该组件如下所示:
`ngOnInit(){
this.headerService.hideToolbarHeader$.subscribe((value) => {
console.log('EXECUTED WITH VALUE', value)
this.hideToolBarHeader = value;
})
}`
控制台记录正确的值。
组件 html 模板:
`<div class="toolbar" [class.mat-elevation-z7]="isSticky" [ngClass]="{'hide-toolbar': hideToolBarHeader }" >
<mat-toolbar #toolbarDiv color="primary" [ngStyle]="{backgroundColor: (isSticky) ? null : 'transparent'}">
...
</mat-toolbar>`
更改检测不会在工具栏组件中触发。值得注意的是,标题组件已经实例化并创建,而触发值更改的组件稍后出现。
我尝试过: - 强制更改检测手动运行,ChangeDetectorRef
但没有运气。-hideToolbarHeader$
从 Subject 更改为 BehaviorSubject 到 ReplaySubject
我在模板 p 标签中显示了 this.hideToolBarHeader 的值。我可以在控制台中看到该值是正确的。仅当我单击导航标题时,该值才会更改。有时它会在我上下滚动一点后随机变化。怎么了?
解决方案
在可观察对象上使用异步管道而不是订阅
hideToolbarHeader$ = this.headerService.hideToolbarHeader$;
并在模板中
[ngClass]="{'hide-toolbar': (hideToolbarHeader$ | async) }"
推荐阅读
- go - Go - 我如何确保没有通过 gRPC 在此代码中发送的空字段?
- c# - 根据另一列的条件计算datagridview中的列
- elasticsearch - 如何将嵌套查询与普通匹配查询一起查询?
- java - 如何使用 Java 找出您的计算机名称
- python - 如何在此类图像中找到最大的空白空间?
- logging - 全局定义的 RingBuf 在 loop() 函数中不起作用
- mysql - 如何取一个字段的开始日期和另一个字段的结束日期来创建一个新字段?
- r - 带有谷歌驱动器凭证和谷歌地球引擎的 RStudio 出错
- python - Python Pyserial 异步
- spring-batch - Spring Batch - 如何从文件的特定部分读取字段和实际数据?