- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试在 Angular 2 组件中监听使用 postMessage 发送的 MessageEvent
。
我的第一次尝试只是做:
window.addEventListener("message", this.handlePostMessage.bind(this));
然后在ngOnDestroy
中:
window.removeEventListener("message", this.handlePostMessage.bind(this));
但是这并没有按预期工作。如果我导航到另一条路线并返回,则会注册两个事件监听器。
所以我一直在尝试用 HostListener 来装饰该方法,但在使用预渲染时我无法正常工作(Angular Universal 与 .NET Core 使用 asp-prerender-module
)。
@HostListener('window:message', ['$event'])
private handlePostMessage(msg: MessageEvent) {
...
}
这在页面加载时出现以下错误:
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();
}
您可以在这里阅读有关它们的更多信息:
https://angular.io/guide/attribute-directives
但是,我目前遇到了与您相同的问题 - 如果我导航到另一条路线并返回,我现在会收到两个事件。那就是使用@HostListener。 :-( 不过我已经有一段时间没有升级 Angular了(目前使用的是 4.4.6),所以也许自该版本以来他们已经修复了它。
**编辑:刚刚升级到 Angular 5.1.0。 “重复事件”@HostListener 问题仍然存在。 :-(
编辑#2:我也像您尝试过的那样使用 window.addEventListener ,并且也遇到了同样的问题,尽管在 ngOnDestroy() 中使用了 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);
这已经在我页面的构造函数中了。我保护了它,所以它只在页面构造函数第一次时执行,现在一切都很好。
关于angularjs - HostListener 和 Angular 通用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44405873/
这个问题在这里已经有了答案: Detect change in orientation using javascript (11 个答案) 关闭 3 年前。 我想检测方向变化,检测我正在以纵向模式或
在 Angular 中,我必须测试以下代码: @HostListener('document:click', ['$event']) public onDocumentClick(event: Mou
我正在尝试找到一种方法来为我的一些使用 HostListener 的组件制作可重用的装饰器。 我目前有几个功能(组件)它们非常相似,并且都具有相同的@HostListener block : @Com
我添加了一个下拉列表并尝试使用指令打开它,但单击不适用于@HostListener。下面是我的 Angular 和 html 代码。 import { Directive, HostListener,
我在 AbstractControl(输入元素)中使用 HostListener 来尝试监听重置事件。但是,当我重置作为此输入元素的父级的表单时,HostListener 不会触发。 您可以在以下位置
Angular 版本:6.0.0 客户端:6.0.0 如果页面滚动 500 像素或更多,我已经使用跟随 HostListener 来显示滚动到顶部按钮,反之亦然。 isSectionFixed : b
我有以下指令。当应用于输入元素时,它会检查字符并在禁止字符时调用 preventDefault: @Directive({ selector: '[cdtPreventInput]' }) ex
我有一个结构指令,它需要像在属性指令上那样监听主机上的事件。 在指令中使用@HostListener没有错误,但是没有接收到事件。 指令代码如下: import { Directive, HostLi
我有一个基于 Angular2 客户端的应用程序。我有一个基类: abstract class BaseClass { @HostListener('window:beforeunload')
我已经定义了模板 @Component({ selector: 'name', directives: [ ... ], templateUrl: 'name.html' })
我有下一个根组件模板,它绘制了 9 个图 block : 和下一个 tile 组件,我在其中添加了用于文档点击的 HostListener: import {AfterVie
我正在尝试跟踪用户何时使用键盘按下 Shift+Tab 组合键,但我无法触发该事件 @HostListener('keyup', ['$event']) @HostListener('keydown'
我想知道如何使用 @HostListener。我找到的唯一信息是在 cheatsheet 中: @HostListener('click', ['$event']) onClick(e) {...}
我正在构建一个 Ionic 3 应用程序,我在其中创建了一个“自动完成”指令,这是一个简单的指令当元素获得焦点时弹出一个自动完成对话框。这是通过“自动完成”完成的: @HostListener('io
我如何获取事件数据(即 $event )我在这里: 而是在这里?: @HostListener('click') onClick($event) { // TypeError: $data
我有两个组件——父组件和子组件。我已将 hoSTListener 附加到两个组件以检测关键事件。我想检测两个组件中的空格键事件。如果用户在子组件文本字段中按下空格键,那么我希望父组件什么也不做。但是,
我在 Angular7 指令中使用 @hoSTListener。我可以为此使用多个事件吗? 问题是在 Android 之外的任何设备上都可以监听 'keydown' 事件,因为后者没有关键事件。 切换
我见过 @HostListner 针对不同元素和事件的例子,我什至见过一个在用户滚动时监听的例子。这些例子看起来像这样 @HostListener('window:scroll', [$event])
我正在尝试对一些在前端完美运行的功能进行单元测试,但单元测试似乎没有发挥作用。 下面是我当前的单元测试,它还没有完全完成我只是想在进行更复杂的检查之前让基本测试工作。 @Component({ t
我想调用一些方法,当 ESCape 按钮被按下时。我是这样做的: @HostListener('window:keydown', ['$event']) clickEscape(event: Keyb
我是一名优秀的程序员,十分优秀!