Sollte ich einen zentralen Event-Bus mit backbone.js verwenden?

8

Ich arbeite gerade an meiner ersten backbone.js App. Der Begriff der Ereignisse ist mir ziemlich vertraut, aber ich bin in Frage, ob ich einen zentralen Event-Dispatcher verwenden soll oder nicht. Im Allgemeinen sehe ich diese zwei Ansätze:

  • Verknüpfen Sie Ereignisveranstalter und Ereignisempfänger direkt miteinander. (Ich begann mit diesem Ansatz.)
  • Verwenden Sie einen Event-Bus und verbinden Sie Herausgeber und Empfänger mit diesem Bus.

Ist es günstig, einen Event-Bus in Bezug auf e zu verwenden? G. lange Wartungsfreundlichkeit der App und Rückverfolgbarkeit von Ereignissen?

    
lost 01.06.2013, 15:24
quelle

1 Antwort

12

Ob ein zentraler Event-Bus verwendet wird oder Ereignisse direkt miteinander verknüpft werden, sollte von Fall zu Fall beurteilt werden. Abhängig von den Umständen, gibt es Zeiten, in denen Sie eines bevorzugen.

Ich werde einen zentralen Event-Bus verwenden, wann immer ich kann, da Publisher und Receiver nicht eng miteinander verbunden sind. Meiner Meinung nach macht dies Ihren Code wartbarer und flexibler.

Ich finde zentrale Ereignisbusse sehr nützlich, wenn Sie:

  1. Eine einzelne Ereignisveröffentlichungsinstanz und zahlreiche Ereignisempfänger.
  2. Viele Ereignisveröffentlichungsinstanzen und ein einzelner Ereignisempfänger

Die Vorteile des zentralen Ereignisbusses in den obigen Fällen werden noch offensichtlicher, wenn die Ereignisempfängerinstanzen oder Herausgeberinstanzen dynamisch sind und somit über die Lebensdauer der Anwendung erstellt und zerstört werden. Betrachten Sie als Beispiel die folgende App mit einer einzelnen Seite:

  1. Die Einzelseiten-App muss so gestreckt werden, dass sie der Breite des Browserfensters entspricht.
  2. Die Einzelseiten-App besteht hauptsächlich aus einer Gruppe von Ansichten mit Registerkarten, die Anzahl der Registerkarten ist jedoch dynamisch, da sie von Benutzern erstellt und zerstört werden
  3. Der Inhalt der Registerkarten unterscheidet sich alle, mit der Ausnahme, dass sie einen Hauptbereich des Inhalts haben, der ausgedehnt werden muss, um der verfügbaren Breite zu entsprechen, nachdem die Breite anderer gleichrangiger Elemente
  4. berücksichtigt wurde
  5. Die Größenanpassung muss an vielen verschiedenen Punkten erfolgen, da sich der Inhalt der Registerkarten ständig ändert.

Im obigen Fall funktioniert das zentrale Busmodell unabhängig vom konkreten Szenario sehr gut. Ein Codebeispiel wäre:

Anwendungsebene

%Vor%

In Ihren Ansichten

Wenn ein Objekt in der Größe angepasst werden muss, lösen Sie das Ereignis aus, zum Beispiel:

%Vor%

Wie Sie sehen, ist dies sehr nützlich, da die Funktion fitRemainingWidth auf alles angewendet werden kann und Sie nie wissen, welche Ansichten sie in Zukunft verwenden oder wann sie aufgerufen werden müssen.

Ich denke also, ich sollte weitermachen, wenn ich keinen zentralen Event-Bus bevorzuge. Ich bin mir sicher, dass es andere Fälle gibt, aber die wichtigste für mich ist, wenn der Empfänger mit einer bestimmten Instanz des Herausgebers verbunden werden muss. Wenn wir beispielsweise mit dem Anwendungsbeispiel für Registerkarten fortfahren, können wir sagen, dass der Inhalt jeder Registerkarte eine geteilte Ansicht des Postfachs einer bestimmten Person ist. In jeder geteilten Ansicht befindet sich ein Listenbereich mit einer Sammlung von E-Mails und einem Lesebereich mit dem Inhalt der aktuell ausgewählten Nachricht in der Liste.

In diesem Fall möchten wir ein Ereignis "selected: email" auslösen, wenn auf eine E-Mail geklickt wird und das entsprechende Lesefenster an sie gebunden ist, damit sie den Inhalt der E-Mail anzeigen kann.

Angenommen, wir haben zehn Mailbox-Registerkarten geöffnet, von denen jedes über einen eigenen E-Mail-Listen- und Lesebereich verfügt. Das macht zehn E-Mail-Listen und zehn Lesefenster. Wenn ich einen zentralen Ereignis-Bus für dieses Szenario verwenden würde, wenn ich eine "ausgewählt: E-Mail" aus einer der Listen ausgelöst hätte, müssten die Lesefenster, die diese Ereignisse vom Ereignis-Bus empfangen, ihre eigenen Smart haben, um zu versuchen und zu arbeiten ob die ausgewählte E-Mail angezeigt werden soll oder nicht. Es ist nicht wirklich wünschenswert, dass jeder Lesebereich versucht, dies auszuarbeiten, und dass eine unumgängliche Logik involviert ist. Es ist viel besser für einen Lesebereich, nur ein "selected: email" -Event mit dem E-Mail-Objekt als Payload zu erhalten und es nur anzuzeigen.

In diesem Szenario ist es also besser, jede Postfachregisterkarte für die Verdrahtung der Ereignisse ihrer spezifischen untergeordneten Ansichtsinstanzen und ihrer Modelle und Sammlungen verantwortlich zu machen. In unserem Beispiel bedeutet dies eine bestimmte Instanz einer E-Mail-Listenansicht mit ihrer Sammlung und einer bestimmten zugeordneten Instanz einer Lesefensteransicht.

Zusammenfassend schlage ich vor, dass es für jeden Anwendungsfall gibt und dass Sie versuchen sollten, bei der Wahl des richtigen Ansatzes für jeden Umstand, auf den Sie stoßen, vernünftig zu sein. Verwenden Sie beide und lernen Sie, was unter welchen Umständen passt.

Schließlich können Sie in Bezug auf die Rückverfolgbarkeit von Ereignissen immer einen Wrapper für die Funktionen On und Off in Ihrem Event-Bus schreiben, der sowohl die normalen Funktionen On und Off aufruft, als auch / entfernt Informationen in ein Register, das angibt, welche Objekte an welche Ereignisse gebunden sind. Sie können dies zum Debuggen verwenden und Informationen über diese Objekte in die Konsole schreiben, sodass Sie jederzeit einen klaren Überblick über den Status Ihres Ereignisbusses und seiner Listener erhalten. Ich habe nie darüber nachgedacht, aber es gibt keinen Grund, warum du das nicht könntest;)

Post Edit : Der Kommentar von tsiki zur Verwendung von Local Event-Bussen ist gut. Im obigen Beispiel, das ich mit vielen Registerkarten-Postfächern gemacht habe, könnten Sie einen lokalen Ereignisbus für jede Benutzerpostfach-Registerkartenansicht verwenden.Dies kann sinnvoll sein, wenn jede Postfachregisteransicht sehr kompliziert wird und viele verschachtelte untergeordnete Ansichten und große Mengen an zu generierenden / zu behandelnden Ereignissen enthält.

    
dcarson 03.06.2013, 05:18
quelle

Tags und Links