Nel tutorial precedente ho mostrato come configurare sia il lato server che il lato client di Discourse per rispondere a una richiesta.
Ora ti consigliamo di leggere la documentazione dei componenti Ember: Introducing Components - Components - Ember Guides
Tutorial precedente
In questo tutorial creerò un nuovo Componente Ember come modo per incapsulare JavaScript di terze parti. Questo sarà simile a un video di YouTube che ho realizzato tempo fa, che potresti trovare informativo, solo che questa volta è specifico per Discourse e per come organizziamo i file nel nostro progetto.
Perché i Componenti?
Handlebars è un linguaggio di templating piuttosto semplice. È solo HTML normale insieme ad alcune parti dinamiche. È facile da imparare e ottimo per la produttività, ma non così eccezionale per il riutilizzo del codice. Se stai sviluppando un’applicazione di grandi dimensioni come Discourse, scoprirai di voler riutilizzare alcune delle stesse cose più e più volte.
I componenti sono la soluzione di Ember a questo problema. Creiamo un componente che visualizzerà il nostro snack in un modo più gradevole.
Creazione di un nuovo Componente
I componenti devono avere un trattino nel loro 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 usare il nostro componente, sostituiremo il nostro template admin/snack esistente 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 alla riutilizzabilità, i componenti in Ember sono ottimi per aggiungere in modo sicuro Javascript personalizzato, jQuery e altro codice esterno. Ti 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 aggiungi il codice sopra e aggiorni la pagina, vedrai che il nostro snack ha un’animazione di uno sfondo giallo che svanisce lentamente.
Spieghiamo cosa sta succedendo qui:
-
Quando il componente viene renderizzato sulla pagina, chiamerà
didInsertElement -
La prima riga di
didInsertElement(ewillDestroyElement) èthis._super()che è necessaria perché stiamo sottoclassificando Ember.Component. -
L’animazione è eseguita utilizzando la funzione animate di jQuery .
-
Infine, l’animazione viene annullata nell’hook
willDestroyElement, che viene chiamato quando il componente viene rimosso dalla pagina.
Potresti chiederti perché ci preoccupiamo di willDestroyElement; il motivo è che in un’applicazione Javascript di lunga durata come Discourse è importante fare pulizia, per non incorrere in perdite di memoria o lasciare cose in esecuzione. In questo caso interrompiamo l’animazione, il che dice a qualsiasi timer jQuery che non è più necessario che si attivi poiché il componente non è più visibile sulla pagina.
Dove andare da qui
Il tutorial finale di questa serie copre i test automatizzati.
Questo documento è controllato tramite versione - suggerisci modifiche su github.