Pelo código que você mostrou, há alguns pontos importantes a verificar porque a sintaxe @for e @if é recente no Angular (a partir da versão 17) e muita coisa muda em relação ao uso do *ngFor e *ngIf tradicionais. Vou listar como corrigi-los:
1. Sintaxe incorreta do bloco @else
Quando se usa @if e @else, você não deve usar ng-template como fazia no *ngIf. O bloco @else já substitui isso.
Seu código está assim:
} @else {
<ng-template #semPensamentos>
<div class="ff-inter sem-pensamentos">
<p>Ainda não há pensamentos cadastrados!</p>
</div>
</ng-template>
}
Isso está errado. O correto seria simplesmente:
} @else {
<div class="ff-inter sem-pensamentos">
<p>Ainda não há pensamentos cadastrados!</p>
</div>
}
2. Verifique se listaPensamentos é reativa
- Se
listaPensamentos vem de um Observable (ex.: listaPensamentos$), você precisa usar o pipe async.
Exemplo:
@if ((listaPensamentos$ | async)?.length > 0) {
@for (pensamento of (listaPensamentos$ | async); track pensamento) {
<div>
<app-pensamento [pensamento]="pensamento"></app-pensamento>
</div>
}
} @else {
<div class="ff-inter sem-pensamentos">
<p>Ainda não há pensamentos cadastrados!</p>
</div>
}
Se você não usar async, o Angular nunca vai renderizar porque o dado não estará disponível no template.
3. Verifique se está usando Angular 17 ou superior
Os blocos de controle (@if, @for, @switch) só funcionam a partir do Angular 17.
Para confirmar:
ng version
Se for menor que 17, você precisa continuar usando *ngIf e *ngFor.
4. Problema com track no @for
O track é equivalente ao trackBy do *ngFor. Você deve passar uma função ou chave única.
Seu código atual:
@for (pensamento of listaPensamentos; track pensamento)
Se pensamento for um objeto, isso pode causar problema.
Recomendo usar o track pensamento.id ou definir uma função trackBy no TS.
Exemplo:
@for (pensamento of listaPensamentos; track pensamento.id) {
<div>
<app-pensamento [pensamento]="pensamento"></app-pensamento>
</div>
}
5. Confirme se o listaPensamentos está sendo carregado
Mesmo com a sintaxe correta, se listaPensamentos estiver vazio ou undefined, não vai renderizar nada.
Verifique no listar-pensamento.component.ts se você está inicializando corretamente:
listaPensamentos: Pensamento[] = [];
ngOnInit() {
this.service.listar().subscribe(lista => {
this.listaPensamentos = lista;
});
}
Código corrigido
<section class="container">
<header class="header d-flex">
<h2 class="ff-inter">Meu Mural</h2>
<button routerLink="/criarPensamento" class="botao">Adicionar pensamento</button>
</header>
@if (listaPensamentos.length > 0) {
<div class="mural">
@for (pensamento of listaPensamentos; track pensamento.id) {
<div>
<app-pensamento [pensamento]="pensamento"></app-pensamento>
</div>
}
</div>
} @else {
<div class="ff-inter sem-pensamentos">
<p>Ainda não há pensamentos cadastrados!</p>
</div>
}
</section>
Faça as correções e veja se está tudo OK, não tenho muito conhecimento em Angular, mas talvez isso possa ajudar