Getting Into Ember.js Parte 3

Spero che tu stia iniziando a vedere che Ember.js è un framework potente, eppure avvincente. Abbiamo solo graffiato la sua superficie; c'è altro da imparare prima di poter costruire qualcosa di veramente utile! Continueremo a utilizzare l'Ember Starter Kit. In questa parte della serie, esamineremo l'accesso e la gestione dei dati all'interno di Ember.


Giocare con i dati

Nell'ultimo articolo, abbiamo lavorato con un set statico di nomi di colori definiti all'interno di un controller:

App.IndexRoute = Ember.Route.extend (setupController: function (controller) controller.set ('content', ['red', 'yellow', 'blue']););

Ciò ha permesso al controller di esporre i dati al indice modello. È carino per una demo, ma nella vita reale, la nostra fonte di dati non sarà una matrice hard-coded.

Qui è dove Modelli entra. Modelli sono rappresentazioni di oggetti dei dati utilizzati dall'applicazione. Potrebbe essere un semplice array o dati recuperati dinamicamente da un'API JSON RESTful. Si accede ai dati stessi facendo riferimento agli attributi del modello. Quindi, se guardiamo un risultato come questo:

"login": "rey", "id": 1, "age": 45, "gender": "male"

Gli attributi esposti nel modello sono:

  • accesso
  • id
  • età
  • Genere

Si accede ai dati stessi facendo riferimento agli attributi del modello.

Come puoi vedere dal codice precedente, potresti definire un archivio statico, ma utilizzerai Ember.Object per definire i tuoi modelli il più delle volte. Per sottoclassi Ember.Object, sarai in grado di restituire i dati (ad es. tramite una chiamata Ajax) e definire il modello. Sebbene sia possibile impostare in modo esplicito i dati all'interno di un controller, è sempre consigliabile creare un modello per aderire alla separazione delle preoccupazioni e alle migliori pratiche di organizzazione del codice.

In alternativa, è possibile utilizzare una struttura sorella chiamata Ember Data. È un'API di tipo ORM e un archivio di persistenza, ma devo sottolineare che è in uno stato di flusso al momento della stesura di questo documento. Ha un sacco di potenziale, ma usando Ember.Object è molto più sicuro in questo momento. Robin Ward, co-fondatore di Discourse, ha scritto un ottimo post sul blog sull'utilizzo di Ember senza Ember Data. Delinea il loro processo, che io abbatterò per te.


Definire i tuoi modelli

Nell'esempio seguente, utilizzerò l'API non ufficiale di Hacker News per estrarre i dati basati su JSON dalla risorsa di notizie. Questi dati verranno memorizzati nel mio modello e successivamente utilizzati da un controller per riempire un modello. Se guardiamo i dati restituiti dall'API, possiamo comprendere le proprietà con cui lavoreremo:

"nextId": null, "items": ["title": "Docker, il runtime del contenitore Linux: ora open-source", "url": "http://docker.io", "id": 5445387 , "commentCount": 39, "punti": 146, "postatoAgo": "2 ore fa", "pubblicatoBy": "shykes", "titolo": "Cosa \ u0027s realmente sbagliato con Yahoo \ u0027s Acquisto di Summly "," url ":" http://hackingdistributed.com/2013/03/26/summly/ "," id ": 5445159," commentCount ": 99," punti ": 133," postatoAgo ":" 2 ore fa "," postedBy ":" hoonose ",]," version ":" 1.0 "," cachedOnUTC ":" \ / Date (1364333188244) \ / "

Voglio lavorare con il elementi proprietà, che contiene tutti i titoli e le informazioni sulla storia. Se hai lavorato con database SQL, pensa a ciascun elemento di elementi come un record e i nomi delle proprietà (ad es .: titolo, url, id, ecc.) come nomi di campi. È importante annodare il layout perché questi nomi di proprietà saranno utilizzati come attributi del nostro oggetto modello, che è un seguito perfetto nella creazione del modello.

Ember.Object è la classe base principale per tutti gli oggetti Ember e la sottoclasseremo per creare il nostro modello usando i suoi estendere() metodo.

Per fare ciò, aggiungeremo il seguente codice a js / app.js immediatamente dopo il codice che definisce App.IndexRoute:

App.Item = Ember.Object.extend ();

App.Item funge da classe modello per i dati di Hacker News, ma non ha metodi per recuperare o manipolare tali dati. Quindi, dovremo definire quelli:

 App.Item.reopenClass (all: function () return $ .getJSON ("http://api.ihackernews.com/page?format=jsonp&callback=?") .Then (function (response) var items = [ ]; response.items.forEach (function (item) items.push (App.Item.create (item));); return items;););

Analizziamo questo codice. In primo luogo, usiamo Ember's reopenClass () metodo per aggiungere i nostri nuovi metodi al App.Item classe, e tu passi un oggetto che contiene i nostri metodi desiderati. Per questo esempio, abbiamo solo bisogno di un metodo chiamato tutti(): restituisce tutti i titoli della prima pagina di Hacker News. Poiché jQuery fa parte dell'accordo con Ember, abbiamo a disposizione la sua semplice API Ajax. L'API utilizza JSONP per restituire i dati JSON; quindi, posso solo usare $ GetJSON () per fare la richiesta a:

$ GetJSON ( "http://api.ihackernews.com/page?format=jsonp&callback=?")

Il "callback =?" dice a jQuery che si tratta di una richiesta JSONP e che i dati (una volta recuperati) vengono passati a un gestore di callback anonimo definito utilizzando la funzionalità promesse di jQuery:

.poi (funzione (risposta) ...);

Posso facilmente pompare i miei dati JSON in un oggetto Ember.

Il risposta parametro contiene i dati JSON, consentendo di scorrere i record e aggiornare il locale elementi array con istanze di App.Item. Infine, restituiamo l'array appena popolato quando tutti() esegue. Sono molte parole, quindi mi permetta di riassumere:

  • Crea il tuo nuovo modello di classe sottoclasse Ember.Object utilizzando estendere().
  • Aggiungi i tuoi metodi di modello usando reopenClass ().
  • Effettua una chiamata Ajax per recuperare i tuoi dati.
  • Passa sopra i tuoi dati, creando un Articolo oggetto e spingendolo in un array.
  • Restituisce l'array quando viene eseguito il metodo.

Se aggiorni index.html, vedrai che nulla è cambiato. Questo ha senso perché il modello è stato solo definito; non ci siamo acceduti.


Esporre i tuoi dati

I controller agiscono come proxy, consentendo di accedere agli attributi del modello e consentendo ai modelli di accedervi per rendere dinamicamente il display. Oltre ad accedere agli attributi da un modello associato, i controllori possono anche memorizzare altre proprietà dell'applicazione che devono persistere senza salvare su un server.

Attualmente, la nostra app ha il seguente controller (quello che definisce un set di dati statici):

App.IndexRoute = Ember.Route.extend (setupController: function (controller) controller.set ('content', ['red', 'yellow', 'blue']););

Possiamo associare direttamente il nostro modello con App.IndexRoute usando il modello metodo (AKA il gancio del modello):

App.IndexRoute = Ember.Route.extend (model: function () return App.Item.all (););

Ricorda che Ember definisce il tuo controller se non lo definisci esplicitamente tu stesso, e questo è ciò che accade in questo caso.

Dietro le quinte, Ember crea IndexController come un esempio di Ember.ArrayController, e usa il modello specificato nel modello metodo.

Ora abbiamo solo bisogno di aggiornare il modello di indice per accedere ai nuovi attributi. Apertura index.html, possiamo vedere il seguente codice template di Handlebars:

#each item in model 
  • articolo
  • /ogni

    Con un piccolo cambiamento (aggiungendo il titolo proprietà), possiamo immediatamente vedere i titoli restituiti dall'API di Hacker News:

    Titolo dell'oggetto

    Se aggiorni il tuo browser ora, dovresti vedere qualcosa di simile al seguente:

     

    Benvenuto in Ember.js

    • Persona è distribuita. Oggi.
    • 21 grafici che mostrano che i prezzi dell'assistenza sanitaria in America sono ridicoli
    • 10.000 connessioni simultanee in tempo reale con Django
    • Docker, il runtime del contenitore Linux: ora open-source
    • Diciamo che FeedBurner si spegne ...

    Se vuoi visualizzare più informazioni, aggiungi semplicemente altre proprietà:

    item.title - item.postedAgo di item.postedBy

    Aggiorna per vedere gli aggiornamenti che hai fatto. Questa è la bellezza di Handlebars; rende banale aggiungere nuovi elementi di dati all'interfaccia utente.

    Come accennato in precedenza, i controller possono anche essere utilizzati per definire attributi statici che devono persistere per tutta la vita della vostra applicazione. Ad esempio, potrei voler mantenere determinati contenuti statici, come questo:

    App.IndexController = Ember.ObjectController.extend (headerName: 'Benvenuto nell'app Hacker News', appVersion: 2.1);

    Qui, sottoclassi Ember.ObjectController creare un nuovo controller per il mio indice percorso e modello con cui lavorare. Ora posso andare index.html e aggiorna il mio modello per sostituire quanto segue:

    Benvenuto in Ember.js

    con:

    HeaderName

    Modelli sono rappresentazioni di oggetti dei dati utilizzati dall'applicazione.

    I manubri assumono gli attributi specificati nel mio controller e sostituiscono dinamicamente il HeaderName segnaposto con il suo valore omonimo. È importante rafforzare due cose:

    • Aderendo alle convenzioni di denominazione di Ember, non ho dovuto fare alcun cablaggio per poter utilizzare il controller con il modello di indice.
    • Anche se ho creato esplicitamente un IndexController, Ember è abbastanza intelligente da non sovrascrivere il modello esistente che è stato associato tramite il percorso.

    È roba abbastanza potente e flessibile!


    Avanti ... Modelli

    Lavorare con i dati in Ember non è difficile. In realtà, la parte più difficile è lavorare con le varie API che abbondano sul web.

    Il fatto di poter facilmente pompare i miei dati JSON in un oggetto Ember rende la gestione sostanzialmente più semplice, anche se non sono mai stato un grande fan dei grandi set di dati sul lato client, specialmente se rappresentati come oggetti.

    È qualcosa su cui dovrò fare più test e spero che Ember Data renda tutto questo banale.

    Detto questo, ho brevemente toccato i modelli in questo articolo. Sono molto importanti ... così tanto che voglio affrontare questo argomento nel suo stesso articolo. Quindi nel prossimo articolo vedremo come sfruttare Handelbars per costruire la tua interfaccia utente e approfondire le varie direttive proposte dal framework di templating.