2013-05-16 7 views
16

Aus meinem Verständnis, die Unterschiede sind die Callback-Funktionen zu Ereignissen auf einem AppRouter sollte in der Controller statt des gleichen Router-Objekt existieren. Auch gibt es eine Eins-zu-Eins-Beziehung zwischen solchen AppRouter & Controller, alle meine Code von Router bewegt sich jetzt zu Controller, ich sehe nicht zu viel Sinn davon? Also warum sie benutzen? Ich muss etwas verpasst haben?Was ist der Vorteil von Marionette AppRouter + Controller über Backbone.Router?

+0

Nun können Sie Ihren Router in viele kleine Controller aufteilen und sie an ein Modul anschließen, um die Dinge zu organisieren ... es ist nur flexibler. – Ingro

+1

Ich kann auch viele normale 'Backbone.Routers' haben oder? Sie werden einen ähnlichen Zweck erfüllen? –

+3

+1 - Ich habe oft gefragt, diese – Bojangles

Antwort

13

So wie ich es sehe, ist Anliegen zu trennen:

  • der Controller funktioniert tatsächlich die Arbeit (die Daten Montage Instanziierung der anzeigen, in Regionen anzeigen usw.) und kann die URL aktualisieren, um den Status der Anwendung (z. B. angezeigten Inhalt) anzuzeigen
  • Der Router löst einfach die Controller-Aktion basierend auf der URL, die in der Adressleiste
  • eingegeben wurde

Also im Grunde, wenn Sie auf der Startseite Ihrer App sind, sollte es ohne Router gut funktionieren: Ihre Aktionen (z. Klicken Sie auf einen Menüeintrag) einfach die verschiedenen Controller-Aktionen auslösen.

Dann fügen Sie auf einem Router hinzu: "Wenn diese URL aufgerufen wird, führen Sie diese Controller-Aktion aus". Und innerhalb Ihres Controllers aktualisieren Sie die angezeigte URL mit navigate("my_url_goes_here"). Beachten Sie, dass Sie trigger: true nicht bestehen.

Für weitere Informationen Besuche Derick Blogbeitrag http://lostechies.com/derickbailey/2011/08/28/dont-execute-a-backbone-js-route-handler-from-your-code/ (Absatz „Die‚AHA!‘Bezüglich Moment zweiten Arguments der Router.Navigate“)

ich auch das Thema mehr Länge in der freien Vorschau behandelt habe mein Buch über Marionette. Siehe Seiten 32-46 hier: http://samples.leanpub.com/marionette-gentle-introduction-sample.pdf

+0

Warum nicht nur Ihren Controller eine Erweiterung des Backbone-Router machen und dann können Sie die Routen Hash in der Steuerung? Wenn der Router und der Controller eine Eins-zu-eins-Beziehung haben und alle Routen-Methoden die auf dem Controller vorhandenen Methoden-Namen abgleichen müssen, dann erreichen Sie sowieso keine Modularität/Entkopplung/Trennung. Und wie viele Zeilen ist Ihr durchschnittlicher Routen-Hash? 5 Zeilen? Ich glaube wirklich nicht, dass 5 weitere Zeilen dem Controller viel Unordnung hinzufügen werden. Ich liebe Marionette für sein View-Management, aber einige der App-Level-Sachen scheinen mir sinnlose Verschleierung zu sein. –

+1

5 Zeilen möglicherweise nicht viel Unordnung auf den Controller hinzufügen, aber Sie vollständig Ihre URL-Verwaltung zu zerstreuen. Wo endet "# contacts/3/update"? Vielleicht geht es zu Ihrem "Bearbeiten" -Controller und verwendet diese Ansicht. Aber vielleicht geht es in eine "Listen" -Ansicht mit der Zeile dieses Kontakts, die ein direktes Bearbeitungsformular hat ... Sie wissen es nicht, und das Greppen nach URL-Strings wird keine erfreuliche Entwicklungserfahrung sein. –

+0

Durch die Aufteilung in kleinere Bereiche lassen sich große Anwendungen verwalten. Das Argument yuo make könnte auf Views erweitert werden: Wenn Controller-Aktionen einer View zugeordnet werden, warum nicht in den Controller einfügen? Denn dann enden Sie mit der gleichen Javascript-Suppe, die Sie vermeiden möchten, wenn Sie ein Framework wie Backbone/Marionette verwenden. Mit anderen Worten: Teile und herrsche! Siehe auch http: // lostechies.com/derickbailey/2012/06/04/anders-Hejlsberg-is-rechts-you-can not-halten-large-Programme-in-javascript/ –

1

Ich habe eine Überschreibung für den Router gemacht. Und verwenden Sie es zur Zeit auf diese Weise (wie Chaplin): https://gist.github.com/vermilion1/5525972

appRoutes : { 
    // route : controller#method 
    'search' : 'search#search' 
    '*any' : 'common#notFound' 
}, 

initialize : function() { 
    this.common = new Common(); 
    this.search = new Search(); 
} 
Verwandte Themen