Wann soll welcher Controllertyp verwendet werden?

8

Ich scheine mehr und mehr verwirrt darüber zu werden, was auf der Oberfläche erscheint, zumindest als ziemlich grundlegende architektonische Fragen bezüglich der Erstellung von Ember-Apps.

Welcher Controllertyp?

In den letzten Monaten habe ich gesehen, wie Leute Controller über Ember.Controller, Ember.ArrayController, Ember.ObjectController und Ember.ArrayProxy implementiert haben. Entfernen von ArrayController und ArrayProxy (aufgrund der Tatsache, dass sie identisch sind), was sind häufige Anwendungsfälle zwischen den einzelnen Typen?

Bisher konnte ich das sammeln:

  • ArrayControllers / Proxies sollten verwendet werden, wenn Sie n -Elemente in der Ansicht haben, die Sie steuern möchten
  • ObjectControllers sollten verwendet werden, wenn die Ansicht einfach genug ist, um ihren Status in einem einzelnen Objekt zu erhalten, oder eine einzelne Instanz des Objekts eines Modells.
  • Controller ---? Keine Ahnung.

Was sind einige grundlegende Unterschiede zwischen den Controllertypen? Es scheint keine konkreten Informationen darüber zu geben, wann und für welchen Anwendungsfall welcher verwendet werden sollte. Die API-Dokumente sind gut darin, mir das Wesentliche jedes einzelnen zu sagen, aber nicht WANN, um jedes zu verwenden.

Die Beziehung zwischen einer Ansicht und einem Controller kann verwirrend sein

Wenn eine View über einen ConnectOutlets-Funktionsaufruf verbunden ist, was genau passiert zwischen dem Controller und der Ansicht?

Sind Ereignisse in die Ansicht selbst eingebunden (was der Fall zu sein scheint) und wenn ja, wo auf der Welt interagieren Sie mit dem Controller-Singleton, um CRUD-esq-Dinge auf seinen Eigenschaften auszuführen? this.get ('controllerName') scheint den Trick nicht zu tun, und fast jeder Post oder Tutorial oder Code-Beispiel da draußen macht das anders.

Modelle, die nicht

sind

Mir ist klar, dass Ember Data dazu beitragen möchte, einige der ärgerlicheren Aspekte des Datenverkehrs zu lösen und synchron zu halten, aber in einer größeren Perspektive, im Konzept von "MVC", scheint Glut nicht wirklich zu haben ein Modell jeder Art. Es ist nur irgendein Objekt, das von einer bestimmten Sache subklassifiziert und dann verfolgt wird ... irgendwo? Irgendwie? Magisch?

@trek genügte, dass ein Ember.Object die Daten und den Status der Bearbeitung auf dem Client verwalten konnte, aber wenn man sich etwas wie die todomvc.com ember App ansieht, verwendet es ein localStorage-Paradigma, das VOLLSTÄNDIG anders ist Implementierung dann alles, was ich angeschaut habe.

Wie genau sollte der "Modell" -Teil der MVC-Gleichung hier gemacht werden?

Ansichten lassen mich Kinder ermorden

Es scheint eine beträchtliche Anzahl von Möglichkeiten zu geben, eine "Ansicht" in Bezug auf das Anzeigen von Markup für einen Benutzer zu erstellen.

  • ContainerViews, die Subviews / Childviews verwenden
  • geschachtelte Steckdosen
  • Lenker Vorlagen + eine Steckdose
  • unter Verwendung von #each foo im Controller
  • Injektion über Literale ( template: Ember.Handlebars.compile('<h1>foo</h1>') etc)

Was ist der richtige Weg, um modulare UI-Komponenten mit ember zu erstellen? Dies ist mehr als alles andere ein großer Schwachpunkt für die Annahme dieses Rahmens für mich.

Ich liebe die Richtung, in die Ember mit der Anwendungsentwicklung im Web geht. Die Konzepte scheinen einfach zu sein, aber die Ausführlichkeit ist die von Objective-C (was angesichts der Abstammung Sinn macht), aber ich schwöre bei Gott, dass ich mich fühle, als würde ich den gottverdammten Rahmen bekämpfen, anstatt an meiner Anwendung zu arbeiten. Die Ausführlichkeit der Syntax und das Fehlen von strukturierter Dokumentation außerhalb der API-Dokumentation (was 300.000 Javascript erlaubt ist eine erhebliche Menge an Code, um einige Breakpoints zu werfen und versuchen, Ihre Probleme zu debuggen).

Ich verstehe die Herausforderung, der ihr gegenübersteht, aber hoffentlich hält euch das wenigstens eine Minute lang auf und denkt darüber nach, wie es dem neuen Entwickler, der mit anderen Frameworks gearbeitet hat, das Leben leichter machen würde ein MVC-Framework, wie Schienen oder Django oder Backbone oder eckig) und sagen: "So denken wir, dass ember verwendet werden sollte".

Nehmen Sie einige der meinungsbildenden Software-Design-Entscheidungen und wenden Sie sie auf die Community an. Wir werden nichts tun, als Cheerleader für dich zu sein, wenn du es tust, versprich es.

    
Thock 12.12.2012, 00:10
quelle

1 Antwort

11

Bitte tut keinen Kindern weh. AFAIK, das Kernteam, sind alle über 18 Jahre alt, daher ist jede Frustration, die mit Glutsaugern zusammenhängt, eindeutig besser auf Erwachsene ausgerichtet. In diesem Sinne ...

Welcher Controllertyp?

Sie haben das "was" recht, aber vielleicht fehlt das "warum". Controller kann ein wenig irreführend sein, vor allem von Schienen kommen. Stellen Sie sich diese Controller-Singletons als den Zustand (In-Memory) Ihrer Anwendung dar.

Welche Art von Controller zu verwenden ist, hängt davon ab, was für diesen Teil Ihrer Anwendung erforderlich ist. Zum Beispiel könnte eine Skizze für eine Serviette für jede App einen Abschnitt topnav, postList, postDetails enthalten. In ember wird jedes durch ein oder mehrere View / Controller-Paare repräsentiert. In dieser App würde ich erwarten, dass ApplicationController und NavigationController Ember.Controler erweitern, während postList ArrayController erweitern würde und PostDetails wäre ein ObjectController.

Sie können alles mit nur Ember.Controller tun, aber ObjectController und ArrayController sind wirklich nützlich für das Wrapping von Modelldaten. Jede nicht-triviale Glut-App wird wahrscheinlich alle drei verwenden.

Die Beziehung zwischen einer Ansicht und einem Controller

Der Job eines Controllers besteht darin, den Kontext bereitzustellen, in dem die Ansicht gerendert wird. Im Idealfall möchten Sie die Logik aus den Ansichten heraushalten, so dass ein typischer Controller viele berechnete Eigenschaften hat, um Dinge wie:

zu tun
  • transformiert Daten von den zugrunde liegenden Modellobjekten
  • sort / filter / wählt eine Liste von Objekten
  • aus
  • spiegelt den Anwendungsstatus wider

Was ist der Deal mit connectOutlets? Hier sollten Sie die angeforderte Route / den Kontext verwenden, um zu entscheiden, welche Ansichten / Daten an die Ausgänge Ihrer Anwendung angeschlossen werden sollen. Die connectOutlet-Methode des Controllers hat eine Menge Magie, um es einfach zu machen, aber vielleicht zu viel Magie. Was passiert (afaik) beim Aufruf: parentcontroller.connectOutlet 'child' ist

  • Ember erstellt eine Instanz von ChildView
  • Der Handle {{outlet}} -Lenker in der Ansicht von parentController ist an diese childView-Instanz
  • gebunden
  • Die untergeordnete Ansicht wird mit dem singleton router.childController als Kontext
  • gerendert

wo Crude Zeug zu tun? : In der Regel in einer Aktion auf dem Router. Das erscheint zunächst verrückt. Stellen Sie sich ember router nicht wie rails vor, sondern als stateManager, der zufälligerweise auch das routing übernimmt. In naher Zukunft wird sich die Router-API ändern, um dies zu verdeutlichen. Wie auch immer, verwenden Sie Router-Aktionen, um Dinge wie das Erstellen von Model-Instanzen, Commit / Rollback-Transaktionen und das Auslösen von Statusänderungen zu tun. Dies ist sehr einfach, wenn Sie den Hilfsschalter {{action}} für Links / Schaltflächen verwenden, da dieser standardmäßig auf den Router ausgerichtet ist.

Die Ansichten auf der anderen Seite sollten Logik für "reagieren auf Browser-Ereignisse" haben - das bedeutet wirklich Low-Level-Zeug wie zeigen / verstecken etwas bei mouseover oder integrieren mit 3rd-Party-Bibliotheken, um Effekte und Animationen zu tun.

Sie können diesen Screencast hilfreich finden, um zu verstehen, wie man CRUD-esq Dinge macht: Ссылка

Modelle WTF?

Vereinbart in Ember könnte jedes Objekt als "Modell" verwendet werden. Ich denke @trek macht einen guten Job zu demonstrieren, wie man dies über Ember.Object erreichen könnte. Dies funktioniert gut für eine einfache App, und vor einem halben Jahr wäre es vielleicht die beste Wette gewesen, da Glutdaten wirklich unreif waren. Ich bin nicht klar in der Geschichte der todomvc-App von ember, aber es wurde vor Monaten geschrieben. Natürlich sollte es aktualisiert werden, aber in der Zwischenzeit würde ich nicht empfehlen, es zu verwenden, um sich über die aktuellen Best Practices von ember zu informieren.

Stattdessen sollten Sie mit Glutendaten gehen. In den letzten Monaten hat es sich wirklich weiterentwickelt und sollte die Standardauswahl für jede neue, nicht-triviale Glut-App sein. @tomdale hat gerade eine großartige Präsentation zu diesem Thema gegeben, ich würde empfehlen, einen Blick darauf zu werfen: Ссылка

Was ist der 'richtige' Weg, um modulare UI-Komponenten mit ember zu erstellen?

Zum Erstellen modularer UI-Komponenten:

  • ContainerViews, die Subviews / Childviews verwenden
  • Injektion über Literale (Vorlage: Ember.Handlebars.compile ...)

Zum Erstellen einer individuellen Anwendung:

  • geschachtelte Steckdosen
  • Lenker Vorlagen + eine Steckdose
  • unter Verwendung von #each foo im Controller

Das Erstellen von modularen UI-Komponenten ist ein völlig anderes Problem als das Erstellen einer Anwendung. Ember.View und seine Unterklassen wurden für diesen Zweck entwickelt. Sie können sie einfach erweitern / kombinieren, um Widgets mit benutzerdefiniertem Verhalten zu erstellen und diese Widgets für verschiedene Anwendungen freizugeben.

Zumindest habe ich es so gesehen. Wenn sie für den internen Gebrauch gedacht sind, könnten sie auch anstelle von Objektliteralen auf Lenkervorlagen verweisen, aber wenn es sinnvoll ist, den Objektliteralansatz zu verteilen, scheint dies am besten zu sein.

Ein großartiges Beispiel aus der Praxis ist das Ember-Bootstrap-Projekt. Ich habe viel über die Arbeit mit Glut-Ansichten gelernt, indem ich die Quelle dieses Projekts durchgelesen habe. Ссылка

TLDR

  • Wählen Sie den Controller aus, der dem Typ der dargestellten Daten zugeordnet ist
  • Controller bieten Kontext für die Ansicht und erinnern sich an den Anwendungsstatus
  • Verwenden Sie Glutendaten für Ihre Modelle
  • Verwenden Sie Unterklassen von Ember.View, um Komponenten
  • zu erstellen
  • Sei nett zu Kindern
Mike Grassotti 12.12.2012, 05:28
quelle

Tags und Links