Angularjs 角度和角度通用

Angularjs 角度和角度通用,angularjs,asp.net-core,angular-universal,Angularjs,Asp.net Core,Angular Universal,我正在尝试在Angular 2组件中收听随postMessage一起发送的MessageEvent 我的第一次尝试就是: window.addEventListener("message", this.handlePostMessage.bind(this)); 然后在Ngondestory中: window.removeEventListener("message", this.handlePostMessage.bind(this)); 然而,这并没有像预期的那样起作用。如果我导航到另一

我正在尝试在Angular 2组件中收听随postMessage一起发送的
MessageEvent

我的第一次尝试就是:

window.addEventListener("message", this.handlePostMessage.bind(this));
然后在Ngondestory中:

window.removeEventListener("message", this.handlePostMessage.bind(this));
然而,这并没有像预期的那样起作用。如果我导航到另一条路线并返回,则会注册两个事件侦听器

因此,我一直在尝试用来装饰该方法,但在使用预渲染(Angular Universal with.NET Core使用)时,我无法实现这一点

这使我在页面加载时出现以下错误:

Exception: Call to Node module failed with error: Prerendering failed because of error: ReferenceError: MessageEvent is not defined

有解决办法吗

您收到此错误是因为未定义MessageEvent。必须导入定义此项的任何文件

我的@HostListeners如下所示:

@HostListener("window:savePDF", ["$event"]) savePDF(event) {
    this.savePDFButtonPushed();
}
您可以在此处阅读更多关于它们的信息:

然而,我目前遇到的问题与您相同——如果我导航到另一条路线并返回,我现在会收到两个事件。这就是使用@HostListener.:-(不过我已经有一段时间没有升级Angular了(目前使用的是4.4.6),所以他们可能已经在该版本之后修复了它

**编辑:刚升级到Angular 5.1.0。HostListener的“重复事件”问题仍然存在:-(

编辑#2:我也尝试过使用window.addEventListener,就像您尝试过的那样,但也有同样的问题,尽管在Ngondestory()中使用了window.removeEventListener

这让我更深入地挖掘,在那里我发现了一些我添加的代码,用于侦听来自子iFrame的消息。您的代码中是否有类似的内容

        var eventMethod = window.addEventListener ? "addEventListener" : "attachEvent";
        var eventer = window[eventMethod];
        var messageEvent = eventMethod == "attachEvent" ? "onmessage" : "message";

                // Listen to messages from child window ("unsign" and "savePDF") and pass those along as events to Angular can pick them up in its context
        eventer(messageEvent,function(e) {
            window.dispatchEvent( new Event( e.data ) );
        },false);

这已经在我的页面的构造函数中。我对它进行了保护,因此它只在页面第一次成为构造函数时执行,现在一切正常。

刚刚更新了我的答案。请参阅编辑#2以查看它是否对您有帮助!
        var eventMethod = window.addEventListener ? "addEventListener" : "attachEvent";
        var eventer = window[eventMethod];
        var messageEvent = eventMethod == "attachEvent" ? "onmessage" : "message";

                // Listen to messages from child window ("unsign" and "savePDF") and pass those along as events to Angular can pick them up in its context
        eventer(messageEvent,function(e) {
            window.dispatchEvent( new Event( e.data ) );
        },false);