Carregando...

Referência de Sintaxe de Template

A Referência de Sintaxe de Template em Angular é a base que permite que desenvolvedores interajam com o DOM de forma declarativa e eficiente, integrando componentes, gerenciamento de estado e fluxo de dados. Essa referência descreve todas as diretivas, bindings e variáveis de template que permitem a comunicação entre o template e a lógica do componente, essencial para construir aplicações modernas de página única (SPA).
Usando essa sintaxe, é possível implementar interpolation, property binding, event binding, two-way binding, diretivas estruturais como ngIf e ngFor, além de variáveis de referência de template como #var. Esses recursos facilitam o gerenciamento de estado local e global, evitando práticas prejudiciais como prop drilling e re-renderizações desnecessárias.
Neste guia avançado, o leitor aprenderá a criar componentes reutilizáveis, otimizar o fluxo de dados entre componentes, manipular lifecycle hooks e aplicar práticas de performance e segurança em aplicações Angular. A referência também se aplica diretamente a projetos SPA complexos, oferecendo estratégias para otimização e manutenção de código escalável, modular e de alto desempenho.

Exemplo Básico

typescript
TYPESCRIPT Code
import { Component, ViewChild, ElementRef } from '@angular/core';

@Component({
selector: 'app-counter',
template: `       <h2>Contador Simples</h2>       <p #counterDisplay>{{ counter }}</p>       <button (click)="increment()">Incrementar</button>
`
})
export class CounterComponent {
counter: number = 0;

@ViewChild('counterDisplay', { static: true }) counterElem!: ElementRef<HTMLParagraphElement>;

increment() {
this.counter++;
console.log('Valor do contador:', this.counterElem.nativeElement.textContent);
}
}

Neste exemplo, CounterComponent demonstra a criação de um contador simples. A variável de referência de template #counterDisplay permite acessar o elemento <p> diretamente no TypeScript usando @ViewChild, garantindo tipagem segura. A função increment() atualiza a propriedade counter, que é exibida no template via interpolation {{ counter }}, mostrando a atualização automática do DOM, ilustrando o fluxo de dados unidirecional do Angular.
O exemplo também previne prop drilling, mantendo o estado local no componente e evitando alterações desnecessárias no DOM. Esse padrão é fundamental em aplicações reais, pois garante performance e manutenção fácil, além de fornecer base sólida para implementar interações mais complexas, como formulários dinâmicos ou listas iterativas.

Exemplo Prático

typescript
TYPESCRIPT Code
import { Component, Input, ViewChild, ElementRef, AfterViewInit } from '@angular/core';

@Component({
selector: 'app-message',
template: `       <div #messageBox class="message-box">{{ message }}</div>
`,
styles: ['.message-box { padding: 10px; border: 1px solid #ccc; margin-top: 10px; }']
})
export class MessageComponent implements AfterViewInit {
@Input() message: string = '';
@ViewChild('messageBox') box!: ElementRef<HTMLDivElement>;

ngAfterViewInit() {
console.log('Mensagem exibida:', this.box.nativeElement.textContent);
}
}

@Component({
selector: 'app-root',
template: `       <h1>Aplicativo de Mensagens</h1>       <app-message [message]="userMessage"></app-message>       <input [(ngModel)]="userMessage" placeholder="Digite sua mensagem" />
`
})
export class AppComponent {
userMessage: string = 'Olá Angular!';
}

Advanced Angular Implementation

typescript
TYPESCRIPT Code
import { Component, ViewChild, ElementRef, ChangeDetectionStrategy, AfterViewInit } from '@angular/core';
import { BehaviorSubject } from 'rxjs';

@Component({
selector: 'app-live-counter',
template: `       <h2>Contador Avançado</h2>       <p #display>{{ counter$ | async }}</p>       <button (click)="increment()">Incrementar</button>
`,
changeDetection: ChangeDetectionStrategy.OnPush
})
export class LiveCounterComponent implements AfterViewInit {
private counterSubject = new BehaviorSubject<number>(0);
counter$ = this.counterSubject.asObservable();

@ViewChild('display') displayElem!: ElementRef<HTMLParagraphElement>;

increment() {
this.counterSubject.next(this.counterSubject.value + 1);
}

ngAfterViewInit() {
console.log('Valor inicial do contador:', this.displayElem.nativeElement.textContent);
}
}

A implementação avançada demonstra práticas recomendadas, como o uso de BehaviorSubject para estado reativo, ChangeDetectionStrategy.OnPush para otimização de performance e @ViewChild para manipulação segura do DOM. Evita-se prop drilling e re-renderizações desnecessárias, mantendo a aplicação rápida e modular.
Erros comuns incluem manipulação direta do DOM antes do ngAfterViewInit e alteração direta do estado sem observáveis. Angular DevTools e testes unitários são essenciais para depuração e otimização. Para segurança, deve-se evitar dados não confiáveis no DOM e utilizar sanitização adequada.

📊 Referência Completa

Angular Element/Method Description Syntax Example Notes
template reference variable Acesso a elementos ou componentes locais #varName <input #username /> Usado com @ViewChild
@ViewChild Acesso a referência de template @ViewChild('var') varElem @ViewChild('username') inputEl static: true/false
@ViewChildren Acesso a múltiplas referências @ViewChildren('var') elems @ViewChildren('item') items Retorna QueryList
ngIf Renderização condicional *ngIf="condition" <div *ngIf="isVisible"></div> Exibe ou oculta elemento
ngFor Renderização em loop *ngFor="let item of items" <li *ngFor="let i of list">{{i}}</li> Recomendado usar trackBy
ngClass Classe CSS dinâmica [ngClass]="{'class': condition}" <div [ngClass]="{'active': isActive}"></div> Aceita object/array/string
ngStyle Estilo inline dinâmico [ngStyle]="{'color': color}" <p [ngStyle]="{'font-size.px': size}"></p> CSS inline
@Input Entrada parent→child @Input() prop @Input() message:string; Data binding
@Output Saída child→parent @Output() event = new EventEmitter() @Output() changed = new EventEmitter<number>() EventEmitter
ngModel Two-way binding [(ngModel)]="value" <input [(ngModel)]="username" /> Necessita FormsModule
AfterViewInit Lifecycle hook ngAfterViewInit() ngAfterViewInit() {…} Após renderização da view
ChangeDetectionStrategy Default/OnPush Default Define estratégia de detecção de mudanças Otimização de performance
BehaviorSubject Estado reativo new BehaviorSubject(initial) counter$ = new BehaviorSubject(0) Observable com valor inicial

📊 Complete Angular Properties Reference

Property Values Default Description Angular Support
static true/false false Inicialização @ViewChild Angular 8+
read ElementRef/TemplateRef/Component ElementRef Tipo de dado injetado Angular 8+
trackBy Function undefined Otimização ngFor Angular 2+
changeDetection Default/OnPush Default Estratégia de detecção de mudanças Angular 2+
encapsulation Emulated/None/ShadowDom Emulated Encapsulamento CSS Angular 2+
providers Array [] Serviços DI Angular 2+
animations Array [] Animações do componente Angular 4+
interpolation Array ['{{','}}'] Sintaxe de interpolation Angular 2+
preserveWhitespaces true/false true Preservar espaços em branco Angular 2+
outputs Array [] Saídas do componente Angular 2+
inputs Array [] Entradas do componente Angular 2+
host Object {} Host bindings/listeners Angular 2+

A Referência de Sintaxe de Template é essencial para construir componentes reutilizáveis, gerenciar fluxo de dados e lifecycle hooks de maneira eficiente. Desenvolvedores que dominam essa referência conseguem criar aplicações SPA robustas e performáticas. Para aprofundamento, recomenda-se estudar formulários Angular, RxJS Observables, diretivas avançadas e práticas de otimização. Prática em projetos reais e consulta à documentação oficial do Angular consolidam a aprendizagem.

🧠 Teste Seu Conhecimento

Pronto para Começar

Teste Seu Conhecimento

Desafie-se com este questionário interativo e veja o quão bem você entende o tópico

4
Perguntas
🎯
70%
Para Passar
♾️
Tempo
🔄
Tentativas

📝 Instruções

  • Leia cada pergunta cuidadosamente
  • Selecione a melhor resposta para cada pergunta
  • Você pode refazer o quiz quantas vezes quiser
  • Seu progresso será mostrado no topo