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
typescriptimport { 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
typescriptimport { 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
typescriptimport { 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
Teste Seu Conhecimento
Desafie-se com este questionário interativo e veja o quão bem você entende o tópico
📝 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