Questa è la seconda parte di una serie in tre parti che ti insegnerà come creare un'applicazione di gestione contatti in JavaScript utilizzando CanJS e jQuery. Quando hai finito con questo tutorial, avrai tutto il necessario per creare le tue applicazioni JavaScript utilizzando CanJS!
Nella prima parte, sono stati creati i modelli, le viste e i controlli necessari per visualizzare i contatti e le apparecchiature utilizzate per simulare un servizio REST.
In questa parte, dovrai:
Verrai aggiunto ai file di origine dalla prima parte, quindi se non lo hai già fatto, torna subito a leggere. Sarò qui quando sarai pronto.
Il routing aiuta a gestire la cronologia del browser e lo stato del client nelle applicazioni JavaScript a pagina singola.
Il routing aiuta a gestire la cronologia del browser e lo stato del client nelle applicazioni JavaScript a pagina singola. L'hash nell'URL contiene proprietà che un'applicazione legge e scrive. Varie parti dell'app possono ascoltare queste modifiche e reagire di conseguenza, in genere aggiornando parti della pagina corrente senza caricarne una nuova.
can.route
è un osservabile speciale che aggiorna e risponde ai cambiamenti in window.location.hash
. Uso can.route
per mappare gli URL alle proprietà, risultando in URL carini come #! / Filtro tutto
. Se non sono definiti percorsi, il valore di hash viene semplicemente serializzato nella notazione con codifica URL come #! Category = tutto
.
In questa applicazione, il routing verrà utilizzato per filtrare i contatti per categoria. Aggiungi il seguente codice al tuo contacts.js
file:
can.route ('filter /: category') can.route (", category: 'all')
La prima riga crea un percorso con a categoria
proprietà che la tua applicazione sarà in grado di leggere e scrivere. La seconda riga crea una rotta predefinita, che imposta il categoria
proprietà a tutti
.
UN Model.List
è una matrice osservabile di istanze di modelli. Quando definisci a Modello
piace Contatto
, un Model.List
per quel tipo di modello viene creato automaticamente. Possiamo estendere questo creato Model.List
aggiungere funzioni di aiuto che operano su un elenco di istanze di modello.
Lista dei contatti
avrà bisogno di due funzioni di supporto per filtrare un elenco di contatti e segnalare quanti contatti ci sono in ogni categoria. Aggiungi questo a contacts.js
subito dopo il Contatto
modello:
Contact.List = can.Model.List (filter: function (category) this.attr ('length'); var contacts = new Contact.List ([]); this.each (function (contact, i) if (category === 'all' || category === contact.attr ('category')) contacts.push (contact)) return contacts;, count: function (category) return this.filter (categoria) .lunghezza;);
Le due funzioni di supporto qui sono:
filtro()
scorre attraverso ciascun contatto nell'elenco e restituisce un nuovo Lista dei contatti
di contatti all'interno di una categoria. this.attr ( 'lunghezza')
è incluso qui, quindi EJS configurerà l'associazione live quando usiamo questo helper in una vista.contare()
restituisce il numero di contatti in una categoria usando il filtro()
funzione di aiuto. Per colpa di this.attr ( 'lunghezza')
nel filtro()
, EJS imposterà il live binding quando usiamo questo helper in una vista. Se utilizzi un helper in EJS, utilizza
attr ()
su una lista o su una proprietà di istanza per l'installazione di live binding.
Successivamente, modificherai il contactsList.ejs
visualizzare per filtrare i contatti in base alla proprietà della categoria nell'hash. Nel contactsList.ejs
visualizza, cambia il parametro passato a elenco()
aiuto a contacts.filter (can.route.attr ( 'categoria'))
. Il file EJS dovrebbe apparire come questo quando hai finito:
Sulla seconda riga, filtro()
viene chiamato con la categoria corrente da can.route
. Da quando hai usato attr ()
nel filtro()
e via can.route
, EJS imposterà il live binding per ri-renderizzare l'interfaccia utente quando uno di questi cambierà.
Ormai dovrebbe essere chiaro quanto sia potente il live binding. Con un leggero aggiustamento alla tua vista, l'interfaccia utente dell'app sarà ora completamente sincronizzata non solo con l'elenco dei contatti, ma anche con la proprietà della categoria definita nel percorso.
I contatti vengono filtrati quando viene modificata la proprietà della categoria nell'hash. Ora hai bisogno di un modo per elencare tutte le categorie disponibili e modificare l'hash.
Innanzitutto, crea una nuova vista per visualizzare un elenco di categorie. Salva questo codice come filterView.ejs
nel tuo visualizzazioni
cartella:
Esaminiamo alcune righe di questo codice e vediamo cosa fanno:
<% $.each(categories, function(i, category) %>
$ .Ogni
scorre tra le categorie ed esegue una richiamata per ciascuna di esse.
"><%= category.name %> (<%= contacts.count(category.data) %>
Ogni link ha un Dati-categoria
attributo che verrà inserito nell'oggetto dati di jQuery. Successivamente, è possibile accedere a questo valore utilizzando .dati ( 'categoria')
sul etichetta. Il nome della categoria e il numero di contatti saranno utilizzati come test di collegamento. L'associazione dal vivo è impostata sul numero di contatti perché
contare()
chiamate filtro()
che contiene this.attr ( 'lunghezza')
.
can.Control
Il controllo associa automaticamente metodi che sembrano gestori di eventi quando viene creata un'istanza. La prima parte del gestore eventi è il selettore e la seconda parte è l'evento che si desidera ascoltare. Il selettore può essere un qualsiasi selettore CSS valido e l'evento può essere qualsiasi evento DOM o evento personalizzato. Quindi una funzione come 'un clic'
ascolterà un clic su qualsiasi tag all'interno dell'elemento del controllo.
Il controllo usa la delega degli eventi, quindi non devi preoccuparti di riconciliare i gestori di eventi quando il DOM cambia.
Creare il controllo che gestirà le categorie aggiungendo questo codice a contacts.js
subito dopo Contatti
Controllo:
Filter = can.Control (init: function () var category = can.route.attr ('category') || "all"; this.element.html (can.view ('filterView', contacts: this .options.contacts, categories: this.options.categories)); this.element.find ('[data-category = "' + category + '"]'). parent (). addClass ('active'); , '[categoria dati] fa clic su': function (el, ev) this.element.find ('[categoria-dati]'). parent (). removeClass ('active'); el.parent (). addClass ('active'); can.route.attr ('category', el.data ('category')););
Esaminiamo il codice dal controllo "Filtro" appena creato:
this.element.html (can.view ('filterView', contacts: this.options.contacts, categories: this.options.categories));
Come nel Contatti
Controllo, dentro()
usi posso vedere()
per rendere le categorie e html ()
per inserirlo nell'elemento del controllo.
this.element.find ('[data-category = "' + category + '"]'). parent (). addClass ('active');
Trova il collegamento che corrisponde alla categoria corrente e aggiunge una classe di 'attivo' al suo elemento genitore.
'[categoria dati] clicca': function (el, ev)
Ascolta per a clic
evento su qualsiasi elemento corrispondente al selettore [-Categoria di dati]
.
. This.element.find ( '[data-categoria]') parent () removeClass ( 'attivo').; . El.parent () addClass ( 'attivo');
Rimuove la classe 'active' da tutti i link quindi aggiunge una classe di 'active' al collegamento su cui è stato fatto clic.
can.route.attr ('category', el.data ('category'));
Aggiorna la proprietà della categoria in can.route
utilizzando il valore dell'oggetto dati di jQuery per il quello è stato cliccato.
Proprio come il Contatti
Controllo nella prima parte, è necessario creare una nuova istanza di Filtro
Controllo. Aggiorna la tua funzione pronta per il documento per assomigliare a questa:
$ (document) .ready (function () $ .when (Category.findAll (), Contact.findAll ()). then (function (categoryResponse, contactResponse) var categories = categoryResponse [0], contacts = contactResponse [0] ] nuovi contatti ("# contatti", contatti: contatti, categorie: categorie); nuovo filtro ("filtro #", contatti: contatti, categorie: categorie););)
Con questa modifica, un'istanza di Filtro
Il controllo verrà creato su #filtro
elemento. Verrà passato l'elenco di contatti e categorie.
Ora, quando si esegue l'applicazione in un browser, sarà possibile filtrare i contatti facendo clic sulle categorie a destra:
Questo è tutto per la seconda parte! Ecco cosa abbiamo realizzato:
Nella terza parte, aggiornerai i controlli esistenti per consentire la modifica e l'eliminazione dei contatti. Creerai anche un nuovo Controllo e Visualizza che ti consentirà di aggiungere nuovi contatti.
Non vedo l'ora di saperne di più? La terza parte della serie è stata pubblicata qui!