Schwere Controller-Kommunikation in AngularJS

8

Ich habe eine einseitige Anwendung mit AngularJS implementiert. Die Seite besteht aus einem Inhaltsbereich in der Mitte und Abschnitten, die um das Zentrum herum angeordnet sind, die zusätzliche Informationen anzeigen und Mittel zum Manipulieren des Zentrums bereitstellen.

Jedem Abschnitt (namens Side Info ) und dem Inhaltsbereich ist ein separater AngularJS-Controller zugewiesen. Derzeit kommuniziere ich über $rootScope.$broadcast und $scope.$on() , z. B.

%Vor%

Ich rufe dann zur Kommunikation mit anderen Controllern auf:

%Vor%

Ich habe ziemlich viel Kommunikation zwischen den Controllern. Vor allem, wenn im Content-Bereich etwas passiert, müssen mehrere Side-Info-Elemente übernommen werden. Umgekehrt kommt es auch häufig vor: Ein Benutzer sendet ein Formular (in einer Side-Info) und der Inhaltsbereich und andere Side-Info-Elemente müssen übernommen werden.

Meine Frage: Gibt es eine bessere Möglichkeit, SPA mit starker Controller-Kommunikation zu behandeln?

Der Code funktioniert gut, aber es wird schon etwas unordentlich (z. B. ist es schwer zu finden, welche Ereignisse wo behandelt werden etc.). Da die Anwendung wahrscheinlich in den nächsten Wochen stark wachsen wird, möchte ich diese Änderungen (wenn es bessere Lösungen gibt) so schnell wie möglich machen.

    
WeSt 05.02.2015, 15:25
quelle

4 Antworten

1

Das ist wirklich interessant. Pub / Sub sollte hier eine richtige Lösung sein.

Sie können Ihrem Projekt zusätzliche Aufträge hinzufügen, indem Sie die als Ihr MVC-Modell verwenden und dieses Modell für jede Änderung aktualisieren. Das Problem hier ist, dass Sie ein beobachtbares Muster in Ihrem Dienst implementieren und sich bei ihnen registrieren sollten, damit dies live synchronisiert wird. Also - wir sind wieder bei Pub / Sub (oder einer anderen beobachtbaren Lösung, an die Sie denken könnten ...).

Aber das Projekt wird auf diese Weise besser organisiert sein.

Zum Beispiel - SideInfo1Service wird ein Service / Modell sein. Jede Änderung der Eigenschaft wird eine beobachtbare Änderung auslösen, die alle Listener ändert:

%Vor%

Sie können diese wirklich interessanten Blogposts über die Verwendung von Angular Services als Ihr MVC-Modell finden:

Ссылка

Ссылка

Und in diesem Beitrag geht es um beobachtbares Muster in Angularjs:

Ссылка

Ich hoffe, das könnte hilfreich sein (:

    
Yaniv Efraim 06.02.2015 19:07
quelle
0

Sie haben mehrere Optionen, um Broadcast-Anrufe zu vermeiden:

  1. Teilen Sie Daten zwischen Controllern mit Diensten, wie sie in den Kommentaren erwähnt wurden. Sie können sehen, wie das geht: Ссылка

  2. Erstellen Sie einen Hauptcontroller für die gesamte Seite und untergeordnete Controller für jeden Abschnitt (Inhaltsbereich und Seiteninfo). Verwenden Sie die Prototypvererbung des Bereichs. Zum Beispiel:

wenn im Hauptcontroller: $scope.myObject = someValue;

In untergeordneten Controllern können Sie Folgendes festlegen: $scope.myObject.myProperty = someOtherValue;

Sie können myObject.myProperty von Ihrem Hauptcontroller aus aufrufen

    
rave 05.02.2015 16:06
quelle
0

Sie können

verwenden %Vor%

weil es nach oben geht und rootscope die oberste Ebene ist

verwenden

%Vor%

um das Ereignis abzufangen

Dann haben Sie eine Kommunikation auf der gleichen Ebene der rootscope ohne Blasenbildung

Hier ist mein implementierter Eventbus-Service

Ссылка

Bearbeiten : Sie können einen Namensraum wie etwas: Ereignis verwenden, um Ihre Ereignisnamen besser zu gruppieren und zu organisieren und Protokollausgaben hinzuzufügen, wenn das Ereignis ausgelöst wird Fang, damit du leicht herausfinden kannst, ob er den falschen Ereignisnamen auslöst oder fängt.

    
micha 05.02.2015 15:46
quelle
0

Sehr wichtige Frage und sehr gute Antworten.

Ich wurde inspiriert und kreierte drei Plunks, die jede Technik zeigten:

Schau dir die Plunks an, hoffentlich hilft das.

    
wojjas 18.02.2015 11:02
quelle

Tags und Links