Status (und Modelle) werden in $ scope gespeichert
$ scope ist das Datenspeicherobjekt von Angular. Es ist analog zu einer Datenbank. $ scope selbst ist nicht das Modell, aber Sie können Modelle in $ scope speichern.
Jeder $ scope hat einen übergeordneten $ scope, bis zu $ rootScope, der eine Baumstruktur bildet, die Ihr DOM lose widerspiegelt. Wenn Sie eine Direktive aufrufen, für die ein neuer $ scope erforderlich ist, z. B. ng-controller, wird ein neues $ scope-Objekt erstellt und dem Baum hinzugefügt.
$ scope-Objekte werden durch prototypische Vererbung verbunden. Dies bedeutet, dass wenn Sie ein Modell auf einer höheren Ebene im Baum hinzufügen, es allen niedrigeren Ebenen zur Verfügung steht. Dies ist eine phänomenal leistungsstarke Funktion, die die $ scope-Hierarchie für den Vorlagenautor nahezu transparent macht.
Controller initialisieren $ scope
Der Zweck des Controllers besteht darin, $ scope zu initialisieren . Der gleiche Controller kann viele $ scope-Objekte in verschiedenen Teilen der Seite initialisieren. Der Controller wird instanziiert, richtet das $ scope-Objekt ein und wird dann beendet. Sie können denselben Controller verwenden, um viele $ scopes in verschiedenen Teilen der Seite zu initialisieren.
Im Fall Ihrer Bildergalerie hätten Sie einen imageGallery-Controller, den Sie dann mit der ng-controller-Direktive auf jeden Teil des DOM anwenden würden, für den Sie eine Galerie sein möchten. Dieser Teil der Seite erhält einen eigenen $ -Bereich, in dem Sie das selectedPhoto-Attribut speichern.
Prototypische Bereiche
$ scope erbt von seinem übergeordneten Element mithilfe einer einfachen alten prototypischen Vererbung bis hin zu $ rootScope, sodass Sie Ihre Objekte an einer beliebigen Stelle in der Hierarchie speichern können, die sinnvoll ist. Sie erhalten einen Baum mit $ scope-Objekten, der sich ungefähr auf Ihr aktuelles DOM bezieht. Wenn sich Ihr DOM ändert, werden bei Bedarf neue $ scope-Objekte für Sie erstellt.
$ scope ist nur ein einfaches JavaScript-Objekt. Es ist nicht verschwenderischer, mehrere $ scope-Objekte zu erstellen, als ein Array mit mehreren currentImage-Objekten zu erstellen. Es ist eine sinnvolle Möglichkeit, Ihren Code zu organisieren.
Auf diese Weise beseitigt Angular das alte Problem "Wo speichere ich meine Daten?", Das wir häufig in JavaScript finden. Dies ist die Quelle eines der wirklich großen Produktivitätsgewinne, die wir durch Angular erzielen.
Haben Sie globale Daten (z. B. eine Benutzer-ID)? Speichern Sie es auf $ rootScope. Haben Sie lokale Daten (z. B. ein aktuelles Bild in einer Galerie, in der mehrere Galerieinstanzen vorhanden sind)? Speichern Sie es auf dem $ scope-Objekt, das zu dieser Galerie gehört.
$ scope steht Ihnen automatisch im richtigen Teil der Vorlage zur Verfügung.
Winkelmodelle sind dünn
Aus einem Rails-Hintergrund stammend, in dem wir uns auf fette Modelle und dünne Controller konzentrieren, fand ich Angulars "kaum da" -Modelle überraschend. Tatsächlich führt das Einfügen einer Menge Geschäftslogik in Ihr Modell häufig zu Problemen auf der ganzen Linie, wie wir manchmal beim Benutzermodell in Rails sehen, das, wenn Sie nicht vorsichtig sind, wächst, bis es nicht mehr wartbar ist.
Ein Winkelmodell ist einfach ein JavaScript-Objekt oder ein Grundelement.
Jedes Objekt kann ein Modell sein. Modelle werden normalerweise mit JSON im Controller oder AJAXed von einem Server definiert. Ein Modell kann ein JSON-Objekt sein oder nur eine Zeichenfolge, ein Array oder sogar eine Zahl.
Natürlich hindert Sie nichts daran, Ihrem Modell zusätzliche Funktionen hinzuzufügen und diese im JSON-Objekt zu speichern, wenn Sie möchten, aber dies würde in einem Paradigma portieren, das nicht wirklich zu Angular passt.
Winkelobjekte sind normalerweise Datenrepositorys, keine Funktionen.
Das Modell am Frontend ist nicht das echte Modell
Natürlich ist das Modell, das Sie auf dem Client halten, nicht das echte Modell. Ihr eigentliches Modell, Ihre einzige Quelle der Wahrheit, lebt auf dem Server. Wir synchronisieren es mithilfe einer API, aber wenn es einen Konflikt zwischen beiden gibt, ist das Modell in Ihrer Datenbank offensichtlich der ultimative Sieger.
Dies gibt Ihnen Privatsphäre für Dinge wie Rabattcodes usw. Das Modell, das Sie in Ihrem Frontend finden, ist eine synchronisierte Version der öffentlichen Eigenschaften des realen Modells, das entfernt ist.
Geschäftslogik kann in Diensten leben.
Angenommen, Sie möchten eine Methode schreiben, um etwas mit Ihrem Modell zu tun, es zu synchronisieren oder beispielsweise zu validieren. In anderen Frameworks könnten Sie versucht sein, Ihr Modell mit einer entsprechenden Methode zu erweitern. In Angular würden Sie eher einen Dienst schreiben.
Services sind Singleton-Objekte. Wie bei jedem anderen JavaScript-Objekt können Sie Funktionen oder Daten in diese einfügen. Angular wird mit einer Reihe integrierter Dienste geliefert, z. B. $ http. Sie können Ihre eigenen erstellen und mithilfe der Abhängigkeitsinjektion diese automatisch für Ihre Controller bereitstellen.
Ein Service kann Methoden enthalten, um beispielsweise mit einer RESTful-API zu kommunizieren, Ihre Daten zu validieren oder andere Arbeiten auszuführen, die Sie möglicherweise ausführen müssen.
Dienstleistungen sind keine Modelle
Natürlich sollten Sie Dienste nicht als Modelle verwenden. Verwenden Sie sie als Objekte, die Dinge tun können. Manchmal machen sie Sachen mit deinem Modell. Es ist eine andere Denkweise, aber eine praktikable.
galleryService
könnte eine Reihe von Galerien speichern.