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.
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 ( Ссылка )
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. : -)
$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
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.
Tags und Links javascript angularjs