Cómo crear directivas de atributo en Angular

Clase 19 de 80Curso de Angular 4

Resumen

Crear una directiva de atributo en Angular es una forma limpia y escalable de aplicar estilos y lógica a elementos del HTML. Aquí aprenderás, con claridad y paso a paso, cómo construir la directiva “resaltar” para destacar negocios con plan pagado, usando ElementRef, Renderer2, OnInit y Input. Ya venías usando ngSwitch, ngStyle y ngClass; ahora darás el salto a una directiva propia.

¿Cómo crear una directiva de atributo para resaltar en Angular?

Partimos del objetivo: resaltar negocios con plan “pagado” en la lista de lugares. El atributo se llama plan y puede ser “pagado” o “gratuito”. Ejemplos mencionados: la florería La Gardenia y el Hotel La Gracia, ambos con plan pagado.

  • Crea la carpeta: directives dentro de app para mantener orden.
  • Nombra el archivo: resaltar.directive.ts.
  • Define un selector de atributo: se usará como [resaltar] en el HTML.

Código base de la directiva:

import { Directive, ElementRef, Renderer2, OnInit, Input } from '@angular/core';

@Directive({
  selector: '[resaltar]'
})
export class ResaltarDirective implements OnInit {
  @Input('resaltar') plan: string = '';

  constructor(private elRef: ElementRef, private renderer: Renderer2) {}

  ngOnInit(): void {
    if (this.plan === 'pagado') {
      this.renderer.setStyle(this.elRef.nativeElement, 'background-color', 'yellow');
      this.renderer.setStyle(this.elRef.nativeElement, 'font-weight', 'bold');
    }
  }
}

¿Cómo ligar el plan con input y el selector?

  • Usa @Input('resaltar') plan para enlazar el valor pasado al atributo [resaltar].
  • El nombre entre comillas en Input debe coincidir con el selector.
  • Inicializa la variable como cadena vacía: evita valores indefinidos.

¿Cómo nombrar carpetas y archivos para mantener orden?

  • Carpeta descriptiva: directives dentro de app.
  • Archivo descriptivo: resaltar.directive.ts.
  • Mantén consistencia: facilita imports y lectura del equipo.

¿Qué imports, decoradores y ciclo de vida necesita la directiva?

La directiva requiere piezas clave de @angular/core para funcionar de forma segura y expresiva.

  • @Directive: declara la directiva y su selector.
  • OnInit / ngOnInit: ejecuta la lógica al inicializar el elemento.
  • ElementRef: referencia al elemento nativo del DOM.
  • Renderer2: aplica estilos y atributos de manera compatible con distintas plataformas.
  • @Input: recibe datos desde el template (enlazado al selector).

¿Por qué usar renderer2 y elementref y no el dom directamente?

  • Código seguro: evita manipulación directa del DOM.
  • Portabilidad: mismo código funciona en distintas plataformas.
  • Claridad: separa la referencia del elemento del modo de estilizarlo.

¿Qué estilos aplica la directiva cuando el plan es “pagado”?

  • Fondo amarillo: background-color: yellow.
  • Texto en negritas: font-weight: bold.
  • Condición simple: if (this.plan === 'pagado') {...}.

¿Cómo registrar e implementar la directiva en el módulo y template?

Para usar la directiva en la app, debes declararla en el módulo y aplicarla en el template.

  • Declara en el módulo: agrega ResaltarDirective a declarations en app.module.ts.
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { AppComponent } from './app.component';
import { ResaltarDirective } from './directives/resaltar.directive';

@NgModule({
  declarations: [
    AppComponent,
    ResaltarDirective
  ],
  imports: [BrowserModule],
  bootstrap: [AppComponent]
})
export class AppModule {}
  • Usa en el template: enlaza el plan de cada lugar al atributo [resaltar].
<li *ngFor="let lugar of lugares" [resaltar]="lugar.plan">
  {{ lugar.nombre }}
</li>
  • Resultado esperado: los negocios con plan “pagado” quedan con fondo amarillo y texto en negritas.
  • Próximos temas: host listeners y host binders para eventos y enlaces al host.

¿Te gustaría ver variantes con clases utilitarias o más atributos dinámicos? Cuéntame en comentarios qué te interesa profundizar y en qué parte te gustaría más ejemplos.