我正在使用MenuModule
primeng
Menu 里面的模型是信号类型
并从服务中取出
现在,当调用服务并填充模型时会显示此错误
ERROR TypeError: Cannot read properties of null (reading 'offsetHeight')
//Html代码
<h1 (click)="statusDispacherClick(213 , $event)">
Status Click
</h1>
<p-menu #menu [model]="listStatusTypes()" [popup]="true" />
//typeScript 代码
@ViewChild('menu') menu !: Menu;
listStatusTypes = signal<any[]>([])
statusDispacherClick(data, event) {
this.service.getDashboardChangeStatusTypes(data).subscribe(dataService => {
dataService.map(x => {
x.label = x.title;
})
this.listStatusTypes.set(dataService);
this.cdRef.detectChanges();
this.menu.toggle(event);
})
}
您应该等到 Angular 完成新模型数据的渲染后再切换菜单。请使用 setTimeout、NgZone.run 或更好的 AfterNextRender 逻辑来延迟调用,直到视图稳定为止。以下是修复方法:
setTimeout(() => ..., 0) 有效的原因:它将 toggle() 调用推送到当前 JavaScript 事件循环的末尾,从而允许 Angular 在尝试访问 offsetHeight 之前更新视图并完全呈现 DOM。
如果您使用带有信号的 @angular/core v16+,并且正在进行反应式 UI 渲染,请考虑将基于信号的逻辑包装在 effect() 中,并通过检查 menu?.el 来控制何时调用 menu.toggle()。
它看起来像一个错误,只有当我们没有立即显示菜单时才会发生。
如果我在 API 调用完成之前打开菜单,则不会出现问题。
作为一种解决方法,我们可以显示一个已禁用的加载指示器,然后打开菜单并进行 API 调用。
完整代码:
TS:
HTML:
Stackblitz 演示