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 leer 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 Ember Component como una forma de envolver JavaScript de terceros. Esto será similar a un video de YouTube que hice hace tiempo, que puede resultarte 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 solo 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 algunas de 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, pasando simplemente el modelo como se requiere.
Agregar código JavaScript personalizado
Además de la reutilizabilidad, los Componentes en Ember son excelentes para agregar de forma segura JavaScript personalizado, jQuery y otro código externo. Te da 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(), que 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 importamos tanto de 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 ni dejar cosas funcionando. 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.
A dónde ir desde aquí
El tutorial final de esta serie cubre las pruebas automatizadas.
Este documento está controlado por versiones - sugiere cambios en github.