Ich habe ein Office-Add-in denen ein Popup-Browserfenster öffnen, indemvom Hinzufügen Ereignis Zuhörer mehrmals
popup = window.open("https://localhost:3000/#/new", "popup", "status=1, location=1, width=1000, height=1200")
Diese Seite wird von Winkel codiert. Um die Kommunikation zwischen dem Add-In und dem Popup zu ermöglichen, habe ich einen Listener im Controller hinzugefügt. Als Ergebnis können sie einander Nachrichten senden durch postMessage
.
app.controller("Ctrl", ["$scope", "$window", function($scope, $window) {
... ...
$window.addEventListener("message", receiveMessage, false);
}
Die Kommunikation funktioniert, außer wenn das Add-In ändert die URL des Popup newUrl
(wo newUrl
eine andere Seite Instanz ist, die den gleichen Controller verwendet), von
popup.location.href = newUrl
Optisch Das Popup hat sich geändert, der vorherige Listener wurde jedoch nicht entfernt. Als Ergebnis wird eine vom Add-In gesendete Nachricht empfangen und zweimal behandelt (dh von der neuen Seite und der vorherigen Seite).
Kann jemand den Listener ordnungsgemäß bereinigen, wenn das Add-In die Popup-Seite ändert?
ich weiß nicht, warum, mein Test zeigt der Hörer immer noch da ist; 'removeEventListener' entfernt den Listener nicht wirklich ... – SoftTimur
können Sie das ausprobieren? $ window.addEventListener ("Nachricht", receiveMessage, {einmal: true, capture: false}); –
Wenn sich receiveMessage im Controller befindet, unterscheidet sich jeder receiveMessage-Callback für jeden Controller-Aufruf von den anderen, sodass er nie entfernt wird. Ihre Ereignis-Ersetzungs- und Ereignis-Hinzufügen-Logik muss denselben Funktionsumfang haben. –