Explicación Signals
Requisitos de finalización
6. Directiva destacar
6.2. Directiva versión avanzada
Una versión más avanzada podría ser con color configurarle y efecto hover opcional (al pasar el ratón)
Código final:
import { Directive, ElementRef, Renderer2, Input, HostListener, OnInit } from '@angular/core';
@Directive({
selector: '[resaltar]'
})
export class ResaltarDirective implements OnInit {
// Color principal (por defecto, rojo)
@Input('resaltar') color: string = 'red';
// ¿Resaltar también al pasar el ratón?
@Input() resaltarHover: boolean = false;
private colorOriginal: string | null = null;
constructor(private el: ElementRef, private renderer: Renderer2) {}
ngOnInit(): void {
// Guardamos el color original para poder restaurarlo luego
this.colorOriginal = this.el.nativeElement.style.color;
// Aplicamos el estilo inicial
this.renderer.setStyle(this.el.nativeElement, 'color', this.color);
this.renderer.setStyle(this.el.nativeElement, 'font-weight', 'bold');
}
// Cuando el ratón entra
@HostListener('mouseenter')
onMouseEnter() {
if (this.resaltarHover) {
this.renderer.setStyle(this.el.nativeElement, 'color', this.color);
this.renderer.setStyle(this.el.nativeElement, 'text-decoration', 'underline');
}
}
// Cuando el ratón sale
@HostListener('mouseleave')
onMouseLeave() {
if (this.resaltarHover) {
this.renderer.setStyle(this.el.nativeElement, 'color', this.colorOriginal || '');
this.renderer.removeStyle(this.el.nativeElement, 'text-decoration');
}
}
}
La importamos en el componente (ya estaba)
import { Component, signal } from '@angular/core';
import { ResaltarDirective } from '../../directivas/resaltar.directive';
@Component({
selector: 'app-flujo-if',
standalone: true,
imports: [ResaltarDirective],
templateUrl: './flujo-if.component.html',
styleUrl: './flujo-if.component.css',
})
export class FlujoIfComponent {
edad = signal(0);
actualizarEdad(valor: string) {
this.edad.set(Number(valor) || 0);
}
}
La utilizamos en la plantilla
<h2 resaltar>Ejemplo @if + directiva resaltar (por defecto rojo)</h2>
<h3 [resaltar]="'blue'">Este título se resalta en azul</h3>
<p
[resaltar]="'green'"
[resaltarHover]="true">
Pasa el ratón por encima de este texto
</p>
<input type="number" (input)="actualizarEdad($event.target.value)" />
@if (edad() < 18) {
<p [resaltar]="'orange'">Eres menor de edad.</p>
} @else {
<p [resaltar]="'purple'" [resaltarHover]="true">
Eres mayor de edad.
</p>
}