Ich habe eine einseitige Web-App mit mehreren backbone.js Ansichten. Die Ansichten müssen manchmal miteinander kommunizieren. Zwei Beispiele:
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?
Eine weit verbreitete Technik ist die Erweiterung des Backbone.Events
-Objekts, um Ihren persönlichen globalen Ereignisaggregator zu erstellen.
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!
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%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%Tags und Links javascript backbone.js