Angularjs Kommunikation zwischen Controllern in verschiedenen Tabs [duplizieren]

8

Ich habe Controller A, der einige Daten an Shared Service sendet, und Controller B, der diese Daten lesen soll. Das Problem ist, Controller B ist auf einer anderen Seite (auf derselben Website) als Controller A, d. H. Ich mache etw. Klicken Sie auf Controller A auf die Schaltfläche (die Daten an den Dienst sendet), und öffnen Sie eine weitere Seite, auf der sich Controller B befindet, der Daten vom Dienst lesen soll. Aber nichts passiert, meine Frage ist, können Controller auf verschiedenen Seiten auf diese Weise kommunizieren?

Hier ist, wie ich es versucht habe, aber ohne Glück:

Service:

%Vor%

Relevante Teile von Controller A:

%Vor%

Relevante Teile von Controller B:

%Vor%

Und sogar console.log("TEST"); wird nicht ausgelöst.

    
hyperN 09.10.2013, 11:34
quelle

4 Antworten

4

Nun, es gibt auch zwei andere Möglichkeiten, zwischen Tabs zu kommunizieren. Über Cookies mit globaler Domain, die nicht als nicht sicher empfohlen wird.

Oder mit postMessage:

Ссылка

Demo:

Ссылка

Und Browserunterstützung:

Ссылка

    
Sebastian Piskorski 14.01.2015, 13:51
quelle
7

basierend auf Ihrer Frage

  

meine Frage ist, können Controller auf verschiedenen Seiten auf diese Weise kommunizieren   ?

Die Antwort lautet nein. Angular und Javascript für diese Angelegenheit sind nicht so konzipiert.

Wenn Sie jedoch unterschiedliche Ansichten auf derselben Seite meinen, dann können Sie ja einen Dienst verwenden. Services sind Singletons und behalten ihre Daten über Controller hinweg, wenn sie auf derselben Seite gespeichert werden.

Wenn Sie wirklich Daten von einer Seite an eine andere senden möchten, tun Sie dies über einen Querystring (auf der URL) oder veröffentlichen Sie die Daten, oder wenn Sie nur moderne Browser unterstützen, dann können Sie die Clientseite lokal verwenden Speicher ( Ссылка )

    
Anton 09.10.2013 11:50
quelle
3

Ich nehme an, wenn Sie zwischen Tabs springen, laden Sie leider die gesamte Seite neu - Tun Sie das nicht. Verwenden Sie stattdessen routeProvider , um ein nettes Routing einzurichten.

%Vor%

Dann würde der Rest Ihres Codes funktionieren und die vom Dienst gespeicherten gemeinsamen Daten behalten, selbst wenn Sie Tabs wechseln. Wenn Sie $routeProvider nicht verwenden möchten, schreiben Sie eine Logik in Ihren Service, um die Daten mit localStorage, indexDB, etc. Persistent zu machen.

Soweit ich sehen kann, verwenden Sie eckige Controller und Dienste, dann sollte es kein Problem sein, auch $ routes zu verwenden. : -)

    
codef0rmer 09.10.2013 13:47
quelle
1

$rootScope.$broadcast ist ein vollkommen akzeptabler Weg, um zwischen den Controllern zu kommunizieren, aber da Sie es über mehrere Seiten hinweg verwenden, würde es nicht funktionieren. Dies ist der Fall, wenn Sie den broadcast Aufruf ausführen, wird der andere Controller nicht geladen und daher wird on method nicht ausgelöst. Da Ihr Dienst jedoch eine Eigenschaft data hat, können Sie direkt darauf zugreifen, indem Sie den Dienst in den anderen Controller einfügen und auf seine Eigenschaft data

zugreifen

controllerCommunicationService.data jederzeit und überall wo Sie wollen, so dass Sie on method nicht benutzen müssen.

Wie von @Anton erklärt, können Sie auch Daten mit querystring \ urlfragments und Clientspeicher übergeben.

    
Chandermani 09.10.2013 12:17
quelle

Tags und Links