Bygg en kontaktbehandler ved hjelp av Backbone.js Del 3

Velkommen til del tre av serien vår som fokuserer på å bygge applikasjoner ved hjelp av Backbone. Hvis du ikke har lest deler ett og to, anbefaler jeg på det sterkeste at du gjør det - bare slik at du vet hvor vi er og hva vi har dekket så langt.

I første del tok vi et grunnleggende utseende og modeller, synspunkter og samlinger. I del to så vi på rutere, hendelser og historikkmodulene. I denne delen skal vi se nærmere på samspill og se hvordan vi kan legge til eller fjerne modeller fra en samling.


Legge til modeller i en samling

Hvis du gjemmer deg tilbake til første del, husker du hvordan vi har lagt til alle våre modeller i samlingen når samlingen ble initialisert. Men hvordan kan vi legge til individuelle modeller i en samling etter at samlingen allerede er initialisert? Det er faktisk veldig enkelt.

Vi legger til muligheten for nye kontakter å bli lagt til som vil innebære en oppdatering til den underliggende HTML og vår hovedvisning. Først, HTML; legg til følgende mark-up i kontaktbeholderen:

Denne enkle skjemaet gjør det mulig for brukere å legge til en ny kontakt. Hovedpoenget er at id attributter av elementene samsvarer med attributtnavnene som brukes av våre modeller, noe som gjør det lettere å få dataene i det formatet vi ønsker.

Deretter kan vi legge til en hendelsesbehandler i vårt hovedvisning slik at dataene i skjemaet kan høstes; legg til følgende kode etter den eksisterende nøkkelen: verdi par i arrangementer gjenstand:

"klikk #add": "addContact"

Ikke glem å legge til kommende komma til slutten av den eksisterende bindingen! Denne gangen angir vi klikk hendelsen utløst av elementet med en id av Legg til, som er knappen på skjemaet vårt. Handler vi er bindende til denne hendelsen er Legg til kontakt, som vi kan legge til neste. Legg til følgende kode etter filterByType () metode fra del to:

addContact: funksjon (e) e.preventDefault (); var newModel = ; $ ("# addContact"). barn ("input"). hver (funksjon (i, el) if ($ (el) .val ()! == "") newModel [el.id] = $ el) .val ();); contacts.push (formData); hvis (_.indexOf (this.getTypes (), formData.type) === -1) this.collection.add (ny kontakt (formData)); dette $ el.find ( "# filter") finne ( "select") fjern () end () føyer (this.createSelect ()).....;  ellers this.collection.add (ny kontakt (formData)); 

Siden dette er en hendelseshåndterer, mottar den automatisk begivenhet objekt, som vi kan bruke for å forhindre standard oppførsel av

Det er alt vi trenger for dette eksemplet. Logikken for å fjerne en individuell modell kan legges til visningsklassen som representerer en individuell kontakt, siden visningseksemplet vil være knyttet til en bestemt modelleksempel. Vi må legge til en hendelsesbinding og en hendelseshåndterer for å fjerne modellen når knappen klikkes. legg til følgende kode til slutten av ContactView klasse:

hendelser: "click button.delete": "deleteContact", deleteContact: function () var removedType = this.model.get ("type"). toLowerCase (); this.model.destroy (); this.remove (); hvis (_.indexOf (directory.getTypes (), removedType) === -1) katalog. $ el.find ("# filter select"). barn ("[value = '" + removedType + "']" ).fjerne(); 

Vi bruker arrangementer motsette seg å spesifisere vår hendelse bindende, som vi gjorde før med vår mestervisning. Denne gangen lytter vi etter klikk hendelser utløst av a