首页 > 解决方案 > 如何正确地将事件侦听器附加到 Angular 6+ 中的全局“窗口”?

问题描述

背景

我们的Angular 6应用程序包含iframe一些第 3 方数据。为了实现安全的跨域通信,子 iframe 使用window.postMessage() API 将消息发布到父 Angular 应用程序。为了接收这些消息,父窗口必须附加一个事件监听window.addEventListener("message", callback)器来监听MessageEvents

问题

我需要在 Angular 组件中侦听消息事件,而如何以windowAngular 方式正确访问全局对我来说并不明显。我目前想到的唯一解决方案是:

  1. 创建一个MessageListenerService使用以下方法调用的 Angular 服务:

function listenForMessageEvent(callback) { this.renderer.listen('window', 'message', callback); }

注意: this.renderer这里是来自 Angular 核心的Renderer2 。

  1. 只需MessageListenerService.listenForMessageEvent()在我的自定义组件中使用。

我觉得这不是 Angular 世界的标准方法。有人可以在这里建议任何最佳做法吗?

非常感谢。

标签: javascriptangulardomiframepostmessage

解决方案


这样做的“Angular”方法是使用HostListener

https://angular.io/api/core/HostListener

这是一个 stackblitz 示例供您查看。使用键盘上的键触发事件时,打开控制台并查看日志。

https://stackblitz.com/edit/hostlistener-1


推荐阅读