Estou usando MenuModule
o Primeng
O modelo dentro do Menu é do tipo sinal
E é retirado do serviço
Agora, quando o serviço é chamado e o modelo é preenchido, este erro é exibido
ERROR TypeError: Cannot read properties of null (reading 'offsetHeight')
//Código HTML
<h1 (click)="statusDispacherClick(213 , $event)">
Status Click
</h1>
<p-menu #menu [model]="listStatusTypes()" [popup]="true" />
//Código 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);
})
}
Você deve esperar até que o Angular termine de renderizar os novos dados do modelo antes de alternar o menu. Use setTimeout, NgZone.run ou, melhor ainda, a lógica AfterNextRender para adiar a chamada até que a visualização esteja estável. Veja como você pode corrigir isso:
Por que setTimeout(() => ..., 0) funciona: Ele envia a chamada toggle() para o final do loop de eventos JavaScript atual, permitindo que o Angular atualize a visualização e renderize o DOM completamente antes de tentar acessar offsetHeight.
Se você estiver usando @angular/core v16+ com sinais e estiver fazendo renderização de interface de usuário reativa, considere envolver sua lógica baseada em sinais em um effect() e controlar quando chamar menu.toggle() marcando menu?.el.
Parece um bug, acontece apenas quando não mostramos o menu imediatamente.
Se eu abrir o menu antes da chamada da API ser feita, não há problema.
Como solução alternativa, podemos mostrar um indicador de carregamento, que está desabilitado, depois abrir o menu e fazer a chamada à API.
Código completo:
TS:
HTML:
Demonstração do Stackblitz