En el tutorial anterior, mostré cómo configurar tanto las partes del servidor como las del cliente de Discourse para responder a una solicitud.
Ahora te recomendamos que leas la documentación de componentes de Ember: Introducing Components - Components - Ember Guides
Antes de escribir un componente, revisa el UI kit de componentes, helpers y modificadores compartidos; la mayoría de los controles comunes ya existen allí.
Antiguo tutorial
En este tutorial, voy a crear un nuevo Componente de Ember como una forma de envolver Javascript de terceros. Esto será similar a un video de YouTube que hice hace tiempo, que puede resultar informativo, solo que esta vez es específico para Discourse y 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 fácil 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 las mismas cosas una y otra vez.
Los componentes son la solución de Ember a este problema. Creemos un componente que mostrará nuestro snack de una manera más elegante.
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 esto:
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 como se requiere.
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 otros códigos externos. Te dan el control de 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.
Explicemos qué está pasando aquí:
-
Cuando el componente se renderiza en la página, llamará a
didInsertElement. -
La primera línea de
didInsertElement(ywillDestroyElement) esthis._super(), lo cual es necesario porque estamos subclaseando Ember.Component. -
La animación se realiza usando 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.
Podrías preguntarte por qué nos importa willDestroyElement; la razón es que en una aplicación Javascript de larga duración como Discourse, es importante limpiar después de nosotros mismos, para no filtrar memoria o dejar cosas ejecutándose. En este caso, detenemos la animación, lo que indica a cualquier temporizador de jQuery que no necesitan dispararse más, ya que el componente ya no es visible en la página.
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.