En el tutorial anterior mostré cómo configurar tanto la parte del servidor como la del cliente de Discourse para responder a una solicitud.
Ahora recomendamos que leas la documentación sobre componentes de Ember: Introducing Components - Components - Ember Guides
Tutorial antiguo
En este tutorial, voy a crear un nuevo componente de Ember como una forma de encapsular JavaScript de terceros. Esto será similar a un video de YouTube que hice hace un tiempo, que quizás encuentres informativo; solo que esta vez es específico de Discourse y de cómo organizamos los archivos en nuestro proyecto.
¿Por qué componentes?
Handlebars es un lenguaje bastante simple y tentador. Es simplemente HTML regular junto con algunas partes dinámicas. Es sencillo de aprender y excelente para la productividad, pero no tanto para la reutilización de código. Si estás desarrollando una aplicación grande como Discourse, descubrirás que quieres reutilizar algunas de las mismas cosas una y otra vez.
Los componentes son la solución de Ember a este problema. Creemos un componente que muestre nuestro snack de una manera más atractiva.
Crear un nuevo componente
Los componentes deben tener un guion en su nombre. Voy a elegir fancy-snack como nombre para este. Creemos nuestra plantilla:
app/assets/javascripts/admin/templates/components/fancy-snack.hbs
<div class="fancy-snack-title">
<h1>{{snack.name}}</h1>
</div>
<div class="fancy-snack-description">
<p>{{snack.description}}</p>
</div>
Ahora, para usar nuestro componente, reemplazaremos nuestra plantilla existente admin/snack con esta:
app/assets/javascripts/admin/templates/snack.hbs
{{fancy-snack snack=model}}
Ahora podemos reutilizar nuestro componente fancy-snack en cualquier otra plantilla, simplemente pasando el modelo según sea necesario.
Agregar código JavaScript personalizado
Además de la reutilización, los componentes en Ember son excelentes para agregar de forma segura JavaScript personalizado, jQuery y otro código externo. Te dan control sobre cuándo se inserta el componente en la página y cuándo se elimina. Para hacer esto, definimos un Ember.Component con algo de código:
app/assets/javascripts/admin/components/fancy-snack.js
export default Ember.Component.extend({
didInsertElement() {
this._super();
this.$().animate({ backgroundColor: "yellow" }, 2000);
},
willDestroyElement() {
this._super();
this.$().stop();
},
});
Si agregas el código anterior y actualizas la página, verás que nuestro snack tiene una animación de un fondo amarillo que se desvanece lentamente.
Explicaremos qué está sucediendo aquí:
-
Cuando el componente se renderiza en la página, se llamará a
didInsertElement. -
La primera línea de
didInsertElement(y dewillDestroyElement) esthis._super(), lo cual es necesario porque estamos subclaseando Ember.Component. -
La animación se realiza utilizando la función animate de jQuery.
-
Finalmente, la animación se cancela en el hook
willDestroyElement, que se llama cuando el componente se elimina de la página.
Quizás te preguntes por qué nos importa willDestroyElement en absoluto; la razón es que en una aplicación de JavaScript de larga duración como Discourse, es importante limpiar después de nosotros mismos, para no filtrar memoria ni dejar cosas ejecutándose. En este caso, detenemos la animación, lo que le indica a cualquier temporizador de jQuery que ya no necesita activarse, ya que el componente ya no es visible en la página.
A dónde ir desde aquí
El tutorial final de esta serie cubre las pruebas automatizadas.
Este documento está bajo control de versiones: sugiere cambios en GitHub.