Construiți un manager de contacte utilizând Backbone.js Partea 4

În partea a patra a acestei serii, am văzut cât de ușor este să adăugați și să eliminați modele din colecția noastră și să păstrați pagina actualizată în sincronizare cu modificările. În această parte, vom examina datele de model existente.


Noțiuni de bază

Vom începe prin adăugarea unui alt buton simplu la șablon, care va permite editarea datelor sale:

Pe măsură ce adăugăm acest buton în șablonul nostru existent, putem adăuga un șablon complet nou care poate fi utilizat pentru a face un formular editabil în care datele de model pot fi modificate. Este foarte asemănător cu șablonul existent și poate fi adăugat la pagină după șablonul existent:

Noul șablon constă în mare parte din elemente care expun datele editabile. Nu trebuie să ne facem griji cu privire la etichetele elementelor, ci să folosim datele din model ca valori implicite pentru fiecare intrare. Rețineți că folosim un câmp de formular ascuns pentru stocarea acestuia tip atributul modelului, vom folosi aceasta pentru a seta valoarea a folosind elementul createSelect () metodă a vederii noastre principale, care, dacă vă amintiți din ultima parte a acestui tutorial, va reveni a pentru a afișa tipul existent al contactului care se editează, setăm valoarea acestuia la valoarea ascunsă am adăugat în șablonul nostru. Apoi introducem noul pentru numele persoanei de contact. Elementul nou selectat este adăugat ca proprietate a instanței de vizualizare, astfel încât să putem interacționa cu ea cu ușurință.

Odată ce am adăugat caseta cu un standard element:

dacă (this.select.val () === "addType") this.select.remove (); $ (“", " class ":" type ")).

Cand element pentru al înlocui. Apoi inserăm noul element folosind jQuery insertAfter () și să-l focalizați pe gata de introducere a textului.


Actualizarea modelului

Apoi, putem adăuga manipulatorul care va lua modificările făcute în formularul de editare și va actualiza datele din model. Adaugă saveEdits () metoda imediat după editContact () metoda pe care tocmai am adăugat-o:

saveEdits: funcția (e) e.preventDefault (); var formData = , prev = this.model.previousAttributes (); $ ()) .closest ("form") find (": input"). "class")] = el.val ();); dacă (formData.photo === "") delete formData.photo;  this.model.set (formData); this.render (); dacă (prev.photo === "/img/placeholder.png") șterge prev.photo;  (contact, functie (contact)) if (_isEqual (contact, prev)) contacts.splice (_ indexOf (contacte, contact), 1, formData); ,

Mai întâi, vom crea un element gol pentru a stoca datele introduse în formular și pentru a stoca, de asemenea, o copie a previousAttributes a modelului care aparține vederii cu care lucrăm. previousAttributes proprietatea modelelor este un magazin de date pe care Backbone îl păstrează pentru noi, astfel încât să putem vedea cu ușurință datele anterioare ale atributelor unui atribut.

Apoi primim fiecare element de intrare din formular folosind o combinație de jQuery găsi() și metoda :intrare filtru, care ne oferă toate câmpurile formularului. Nu vrem să anulați sau să salvați