backbone.js - Wie kommuniziert man zwischen Ansichten?

8

Ich habe eine einseitige Web-App mit mehreren backbone.js Ansichten. Die Ansichten müssen manchmal miteinander kommunizieren. Zwei Beispiele:

  1. Wenn es zwei Möglichkeiten gibt, eine Sammlung auf verschiedene Arten gleichzeitig darzustellen, und ein Klick auf ein Objekt in einer Ansicht muss an die andere Ansicht weitergeleitet werden.
  2. Wenn ein Benutzer zur nächsten Stufe des Prozesses übergeht und die erste Ansicht Daten an die zweite übergibt.

Um die Ansichten so weit wie möglich zu entkoppeln verwende ich derzeit benutzerdefinierte Ereignisse, um die Daten zu übergeben ( $(document).trigger('customEvent', data) ). Gibt es einen besseren Weg, dies zu tun?

    
Johnny 23.07.2012, 09:31
quelle

3 Antworten

14

Eine weit verbreitete Technik ist die Erweiterung des Backbone.Events -Objekts, um Ihren persönlichen globalen Ereignisaggregator zu erstellen.

%Vor%

Je nachdem, ob Sie requirejs oder etwas anderes verwenden, möchten Sie dies möglicherweise in ein eigenes Modul aufteilen oder es zu einem Attribut Ihres Anwendungsobjekts machen. Jetzt können Sie Ereignisse überall in Ihrer App auslösen und anhören.

%Vor%

Damit können Sie den Ereignisaggregator auch für die Kommunikation zwischen Modellen, Sammlungen, dem Router usw. verwenden. Hier ist Martin Fowlers Konzept für die Ereignisaggregator (nicht in Javascript). Und hier ist eine weitere Implementierung und Reflektion zu dem Thema mehr in der Art von Backbone.Marionette, aber das meiste davon ist auf Vanille Backbone anwendbar.

Hoffe das hat geholfen!

    
jakee 23.07.2012, 10:02
quelle
8

Ich stimme @jakee im ersten Teil

zu %Vor%

Wenn Sie jedoch ein globales Ereignis mit "on" abhören, kann dies zu einem Speicherleck- und Zombie-View-Problem führen, das auch mehrere Action-Handler-Aufrufe etc. verursacht.

Anstelle von "on" sollten Sie "listenTo" in Ihrer Ansicht verwenden

%Vor%

Wenn Sie Ihre Ansicht um view.remove() entfernen, wird dieser Handler ebenfalls entfernt, da der Handler an Ihre Ansicht gebunden ist.

Wenn Sie Ihr globales Ereignis auslösen, verwenden Sie einfach

%Vor%     
omeralper 25.05.2014 00:32
quelle
0

jakees Antwort schlägt einen guten Ansatz vor, den ich selbst benutzt habe, aber es gibt einen anderen interessanten Weg, und das ist es Fügen Sie in jede View-Instanz einen Verweis auf ein Objekt ein, wobei das injizierte Objekt wiederum Verweise auf so viele Ansichten enthält, wie Sie aggregieren möchten.

Im Wesentlichen ist der Ansichtsaggregator eine Art "App" -Objekt, und Dinge neben Ansichten könnten angehängt werden, z. Sammlungen. Es beinhaltet die Erweiterung der Ansicht (en) und ist daher vielleicht nicht jedermanns Geschmack, aber andererseits dient das Erweitern als ein einfaches Beispiel dafür.

Ich habe den Code unter Ссылка als Grundlage für meine ListView verwendet und dann habe ich Folgendes bekommen Arbeit:

%Vor%     
George Jempty 21.11.2013 22:09
quelle

Tags und Links