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.
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.
Antony_Dixon_25 , si tu entiendes , bien por ti , no eres nadie , para cuestionar el entendimiento de otra persona , yo tambien tengo base de programación , pero , este profesor lo explica muy rapido , en mi opinion. Si tu sabes , ahorrate tus comentarios y avanza , deja a los demás aprender.
La importancia de usar la CLI para generar la directiva:
Cuando desde la CLI creamos la directiva con
ng generate directive resaltar
automaticamente nos genera el archivo correspondiente y tambien declara la misma en el appModule (evitando errores y olvidos), nombrando tambien al selector como appResaltar.
¿Por qué no “resaltar”? (de la documentación de Angular)
Aunque [resaltar] sería un selector más conciso que [appresaltar] y funcionaría, la mejor práctica es ponerle un prefijo a los nombres de los selectores para garantizar que no entren en conflicto con los atributos estándar de HTML. Esto también reduce el riesgo de colisión con nombres de directivas de terceros.
Tambien, si eres un poco flojo como yo, lo puedes hacer así:
En el decorador @Directive se especifica el selector de la directiva.
ElementRef: nos permite crear una referencia de elemento de HTML para poder manipularla en TypeScript.
Renderer2: También permite manipular un elemento HTML, pero más enfocado a css, esto se hace también para que el mismo código sirva en las diferentes plataformas (servidor, browser, mobile, etc).
ngOnInit: Acá colocamos toda la lógica del negocio, es decir, lo que quremos que nuestra directiva ejecute.
setStyle() recibe tres parámetros: Elemento nativo, Atributo de css que queremos modificar, Valor para el atributo de css.
Me estaba gustando el curso hasta aquí.
Es imposible explicar esto en 9 minutos, se tocan demasiadas cosas en pocos segundos y para los que estamos aprendiendo es imposible entender todo en tan poco tiempo.
Les recomiendo utilizar el editor de Visual Studio Code, instalando los snippets de Angular, pues así mientras creas la directiva, automáticamente va importando las librerias necesarias.
Sin embargo sí considero que no está bien explicada en esta clase qué es cada cosa que se está haciendo. No me gustó.
Es un buen curso desde el punto de vista, “esto se hace así, miren”. Pero falta esa explicación digna de un curso, “esto es así, porque…”. Básicamente una explicación practico-teorica de lo que se está haciendo en el momento. Un poco más de fundamento a cada clase practica siempre es bueno
Es un punto de vista respetable, pero si realmente te dedicas a programar, no hay mucho más para explicar. Para eso hay cursos más introductorios. Saludos
Directivas de atributos (de la documentación de Angular)
Una directiva de atributo cambia la apariencia o el comportamiento de un elemento del DOM.
Hay tres tipos de directivas en Angular:
Components - directivas con un template
Directivas estructurales: cambian el diseño del DOM añadiendo y eliminando elementos. Ej. ngFor - ngIf y ngSwitch
Directivas de atributo: se usan para cambiar la apariencia o el comportamiento de un elemento, componente u otra directiva. La directiva ngStyle por ejemplo , puede cambiar varios estilos de elementos al mismo tiempo.
¿Qué es lo que no entendiste?, la directiva que creeo solo cambia el fondo en casi de que el input que recive sea "pagado".
Se crea la directiva X con el prefijo *.directive.
en el constructor recibes los elementos que trabajaras elRef y renderer
en ngOnInit esta tu logica.
Pregunta. ¿Por qué es necesario que los objetos ElementRef y Renderer2 sean enviados como párametros del constructor en vez de ponerlos como atributos de la clase?
Es decir por qué esto:
Se puede pensar en ElementRef y en Renderer2 como servicios, en vez de simple propiedades. Los servicios se hacen disponibles a la clase por medio de "inyectarlos" en el constructor de la clase donde se usan.
Yo tuve algunos inconvenientes para realizar la directiva de atributo, al final logré realizarlo y quiero compartir mi código.
Primero que todo cambié el nombre del selector en el archivo ‘app.component.html’ pasando de ‘resaltar’ a ‘appResaltar’
Y finalmente en ‘app.module.ts’ se incluye la directiva import { AppResaltarDirective } from './directives/resaltar.directive'; y en NgModule se añade ‘AppResaltarDirective’.
La decisión de cambiar el nombre de la directiva de ‘resaltar’ a ‘appResaltar’ fue porque mirando en foros se comentaba que las directivas necesitan el prefijo ‘app’ esta regla se encuentra establecida en el archivo ‘.angular-cli.json’.
Espero les pueda servir a aquellos que compartan el mismo problema que tuve.
Esa es la línea 5 del código de resaltar.directive.ts