Rückgrat ist ...
... eine sehr kleine Bibliothek von Komponenten, mit denen Sie Ihren Code organisieren können. Es wird als einzelne JavaScript-Datei geliefert. Ohne Kommentare enthält es weniger als 1000 Zeilen tatsächliches JavaScript. Es ist vernünftig geschrieben und Sie können das Ganze in ein paar Stunden lesen.
Es ist eine Front-End-Bibliothek, die Sie mit einem Skript-Tag in Ihre Webseite aufnehmen. Es wirkt sich nur auf den Browser aus und sagt wenig über Ihren Server aus, außer dass es idealerweise eine erholsame API verfügbar machen sollte.
Wenn Sie über eine API verfügen, verfügt Backbone über einige hilfreiche Funktionen, mit denen Sie mit ihr sprechen können. Sie können jedoch Backbone verwenden, um jeder statischen HTML-Seite Interaktivität hinzuzufügen.
Backbone ist für ...
... JavaScript strukturieren.
Da JavaScript keine bestimmten Muster erzwingt, können JavaScript-Anwendungen sehr schnell sehr unübersichtlich werden. Jeder, der etwas anderes als Triviales in JavaScript erstellt hat, wird wahrscheinlich auf Fragen stoßen wie:
- Wo werde ich meine Daten speichern?
- Wo werde ich meine Funktionen platzieren?
- Wie werde ich meine Funktionen miteinander verbinden, damit sie sinnvoll aufgerufen werden und sich nicht Spaghetti zuwenden?
- Wie kann ich diesen Code für verschiedene Entwickler wartbar machen?
Backbone versucht, diese Fragen zu beantworten, indem es Ihnen Folgendes gibt:
- Modelle und Sammlungen zur Darstellung von Daten und Datensammlungen.
- Ansichten, damit Sie Ihr DOM aktualisieren können, wenn sich Ihre Daten ändern.
- Ein Ereignissystem, damit Komponenten einander zuhören können. Dies hält Ihre Komponenten entkoppelt und verhindert eine Spaghettifizierung.
- Eine minimale Anzahl sinnvoller Konventionen, damit Entwickler an derselben Codebasis zusammenarbeiten können.
Wir nennen dies ein MV * -Muster. Modelle, Ansichten und Sonderausstattungen.
Das Rückgrat ist leicht
Trotz anfänglicher Erscheinungen ist Backbone fantastisch leicht und macht kaum etwas. Was es tut, ist sehr hilfreich.
Es gibt Ihnen eine Reihe kleiner Objekte, die Sie erstellen können und die Ereignisse ausgeben und einander zuhören können. Sie können beispielsweise ein kleines Objekt erstellen, um einen Kommentar darzustellen, und dann ein kleines commentView-Objekt, um die Anzeige des Kommentars an einer bestimmten Stelle im Browser darzustellen.
Sie können die commentView anweisen, den Kommentar anzuhören und sich selbst neu zu zeichnen, wenn sich der Kommentar ändert. Selbst wenn an mehreren Stellen auf Ihrer Seite derselbe Kommentar angezeigt wird, können alle diese Ansichten dasselbe Kommentarmodell anhören und synchron bleiben.
Diese Art des Zusammenstellens von Code verhindert, dass Sie sich verheddern, selbst wenn Ihre Codebasis bei vielen Interaktionen sehr groß wird.
Modelle
Zu Beginn ist es üblich, Ihre Daten entweder in einer globalen Variablen oder im DOM als Datenattribute zu speichern . Beide haben Probleme. Globale Variablen können miteinander in Konflikt stehen und sind im Allgemeinen schlecht. Im DOM gespeicherte Datenattribute können nur Zeichenfolgen sein. Sie müssen sie ein- und erneut analysieren. Es ist schwierig, Arrays, Daten oder Objekte zu speichern und Ihre Daten in strukturierter Form zu analysieren.
Datenattribute sehen folgendermaßen aus:
<p data-username="derek" data-age="42"></p>
Das Backbone löst dieses Problem, indem es ein Modellobjekt zur Darstellung Ihrer Daten und der zugehörigen Methoden bereitstellt . Angenommen, Sie haben eine Aufgabenliste, dann hätten Sie ein Modell, das jedes Element in dieser Liste darstellt.
Wenn Ihr Modell aktualisiert wird, wird ein Ereignis ausgelöst. Möglicherweise ist eine Ansicht an dieses bestimmte Objekt gebunden. Die Ansicht wartet auf Modelländerungsereignisse und rendert sich selbst neu.
Ansichten
Backbone bietet Ihnen View-Objekte, die mit dem DOM kommunizieren. Alle Funktionen, die das DOM manipulieren oder auf DOM-Ereignisse warten, finden Sie hier.
Eine Ansicht implementiert normalerweise eine Renderfunktion, die die gesamte Ansicht oder möglicherweise einen Teil der Ansicht neu zeichnet. Es besteht keine Verpflichtung, eine Renderfunktion zu implementieren, aber es ist eine übliche Konvention.
Jede Ansicht ist an einen bestimmten Teil des DOM gebunden, sodass Sie möglicherweise eine searchFormView haben, die nur das Suchformular abhört, und eine ShoppingCartView, die nur den Warenkorb anzeigt.
Ansichten sind normalerweise auch an bestimmte Modelle oder Sammlungen gebunden. Wenn das Modell aktualisiert wird, wird ein Ereignis ausgelöst, das die Ansicht abhört. Die Ansicht könnte sie Rendern nennen, um sich selbst neu zu zeichnen.
Wenn Sie in ein Formular eingeben, kann Ihre Ansicht ebenfalls ein Modellobjekt aktualisieren. Jede andere Ansicht, die dieses Modell anhört, ruft dann ihre eigene Renderfunktion auf.
Dies gibt uns eine saubere Trennung von Bedenken, die unseren Code sauber und ordentlich hält.
Die Renderfunktion
Sie können Ihre Renderfunktion nach Belieben implementieren. Sie können hier einfach jQuery einfügen, um das DOM manuell zu aktualisieren.
Sie können auch eine Vorlage kompilieren und diese verwenden. Eine Vorlage ist nur eine Zeichenfolge mit Einfügepunkten. Sie übergeben es zusammen mit einem JSON-Objekt an eine Kompilierungsfunktion und erhalten eine kompilierte Zeichenfolge zurück, die Sie in Ihr DOM einfügen können.
Sammlungen
Sie haben auch Zugriff auf Sammlungen, in denen Modelllisten gespeichert sind. Eine todoCollection ist also eine Liste von Aufgabenmodellen. Wenn eine Sammlung ein Modell gewinnt oder verliert, ihre Reihenfolge ändert oder ein Modell in einer Sammlung aktualisiert wird, löst die gesamte Sammlung ein Ereignis aus.
Eine Ansicht kann eine Sammlung anhören und sich bei jeder Aktualisierung der Sammlung selbst aktualisieren.
Sie können Ihrer Sammlung Sortier- und Filtermethoden hinzufügen und sie beispielsweise automatisch selbst sortieren lassen.
Und Ereignisse, um alles zusammenzubinden
Anwendungskomponenten sind so weit wie möglich voneinander entkoppelt. Sie kommunizieren über Ereignisse, sodass eine ShoppingCartView möglicherweise eine ShoppingCart-Sammlung abhört und sich selbst neu zeichnet, wenn der Warenkorb hinzugefügt wird.
shoppingCartView.listenTo(shoppingCart, "add", shoppingCartView.render);
Natürlich können auch andere Objekte den Einkaufswagen abhören und andere Dinge tun, z. B. eine Gesamtsumme aktualisieren oder den Status im lokalen Speicher speichern.
- Ansichten hören Modelle ab und rendern, wenn sich das Modell ändert.
- Ansichten hören Sammlungen ab und rendern eine Liste (oder ein Raster oder eine Karte usw.), wenn sich ein Element in der Sammlung ändert.
- Modelle hören Ansichten an, damit sie den Status ändern können, möglicherweise wenn ein Formular bearbeitet wird.
Wenn Sie Ihre Objekte auf diese Weise entkoppeln und über Ereignisse kommunizieren, geraten Sie nie in Knoten, und das Hinzufügen neuer Komponenten und Verhaltensweisen ist einfach. Ihre neuen Komponenten müssen nur die anderen Objekte abhören, die sich bereits im System befinden.
Konventionen
Der für Backbone geschriebene Code folgt einer Reihe loser Konventionen. DOM-Code gehört in eine Ansicht. Sammlungscode gehört in eine Sammlung. Geschäftslogik gehört zu einem Modell. Ein anderer Entwickler, der Ihre Codebasis aufnimmt, kann sofort loslegen.
Um zusammenzufassen
Backbone ist eine kompakte Bibliothek, die Ihrem Code Struktur verleiht. Komponenten sind entkoppelt und kommunizieren über Ereignisse, damit Sie nicht in Unordnung geraten. Sie können Ihre Codebasis einfach erweitern, indem Sie einfach ein neues Objekt erstellen und Ihre vorhandenen Objekte entsprechend anhören. Ihr Code wird sauberer, schöner und wartbarer.
Mein kleines Buch
Ich mochte Backbone so sehr, dass ich ein kleines Intro-Buch darüber schrieb. Sie können es hier online lesen: http://nicholasjohnson.com/backbone-book/
Ich habe das Material auch in einen kurzen Online-Kurs unterteilt, den Sie hier finden: http://www.forwardadvance.com/course/backbone . Sie können den Kurs in ungefähr einem Tag abschließen.