Nell’ultimo tutorial ho mostrato come configurare sia la parte lato server che quella lato client di Discourse per rispondere a una richiesta.
Ora consigliamo di leggere la documentazione sui componenti Ember: Introducing Components - Components - Ember Guides
Vecchio tutorial
In questo tutorial, creerò un nuovo componente Ember come modo per incapsulare codice JavaScript di terze parti. Sarà simile a un video YouTube che ho realizzato tempo fa, che potreste trovare informativo; questa volta, però, sarà specifico per Discourse e per come organizziamo i file nel nostro progetto.
Perché i componenti?
Handlebars è un linguaggio piuttosto semplice e invitante. Si tratta di HTML normale con alcune parti dinamiche. È facile da imparare e ottimo per la produttività, ma meno adatto al riutilizzo del codice. Se state sviluppando un’applicazione grande come Discourse, scoprirete di voler riutilizzare spesso gli stessi elementi.
I componenti sono la soluzione di Ember a questo problema. Creiamo un componente che visualizzi il nostro snack in modo più elegante.
Creazione di un nuovo componente
I componenti devono avere un trattino nel nome. Sceglierò fancy-snack come nome per questo. Creiamo il nostro template:
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>
Ora, per utilizzare il nostro componente, sostituiremo il nostro template esistente admin/snack con questo:
app/assets/javascripts/admin/templates/snack.hbs
{{fancy-snack snack=model}}
Ora possiamo riutilizzare il nostro componente fancy-snack in qualsiasi altro template, passando semplicemente il modello come richiesto.
Aggiunta di codice JavaScript personalizzato
Oltre al riutilizzo, i componenti in Ember sono ottimi per aggiungere in modo sicuro codice JavaScript personalizzato, jQuery e altro codice esterno. Vi danno il controllo su quando il componente viene inserito nella pagina e quando viene rimosso. Per fare ciò, definiamo un Ember.Component con del codice:
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();
},
});
Se aggiungete il codice sopra e aggiornate la pagina, vedrete che il nostro snack avrà un’animazione con uno sfondo giallo che si dissolve lentamente.
Spieghiamo cosa sta succedendo:
-
Quando il componente viene renderizzato nella pagina, viene chiamato
didInsertElement. -
La prima riga di
didInsertElement(e diwillDestroyElement) èthis._super(), che è necessaria perché stiamo estendendo Ember.Component. -
L’animazione viene eseguita utilizzando la funzione animate di jQuery.
-
Infine, l’animazione viene annullata nel hook
willDestroyElement, che viene chiamato quando il componente viene rimosso dalla pagina.
Potreste chiedervi perché ci preoccupiamo di willDestroyElement; la ragione è che in un’applicazione JavaScript di lunga durata come Discourse è importante pulire dopo di sé, per evitare di perdere memoria o lasciare processi in esecuzione. In questo caso, fermiamo l’animazione, il che dice a eventuali timer jQuery che non devono più scattare poiché il componente non è più visibile nella pagina.
Da dove continuare
L’ultimo tutorial di questa serie tratta i test automatizzati.
Questo documento è sottoposto a controllo versione: suggerite modifiche su GitHub.