2016-04-21 60 views

回答

30
<div (window:beforeunload)="doSomething()"></div> 

@Component({ 
    selector: 'xxx', 
    host: {'window:beforeunload':'doSomething'} 
    .. 
)} 

@Component({ 
    selector: 'xxx', 
    .. 
)} 
class MyComponent { 
    @HostListener('window:beforeunload') 
    doSomething() { 
    } 
} 

这是怎么听的全球性事件。我不知道这个事件的特殊行为是否支持返回值用作构造对话框的文本。

,您仍然可以使用

export class AppComponent { 
    constructor() { 
    window.onbeforeunload = function(e) { 
     return 'Dialog text here.'; 
    }; 
    } 
} 

喜欢这里解释https://developer.mozilla.org/de/docs/Web/API/WindowEventHandlers/onbeforeunload

+0

怎么样的'窗口。 onbeforeunload'方法?它怎么不起作用? –

+4

不幸的是,所有3个选项都不起作用。 它必须在父组件上吗?在子组件上,它不会触发事件。例如:window.onbeforeunload = function(e){ alert('Event triggered!');} –

+1

我更新了我的问题。代码(最后一个变体)显示我在Chrome浏览器中离开页面时的对话框。 –

30

冈特Zöchbauer的答案是稍有不当就一点算,这是为我工作:

@Component({ 
    selector: 'xxx', 
    .. 
)} 
class MyComponent { 
    @HostListener('window:beforeunload', ['$event']) 
    doSomething($event) { 
    if(this.hasChanges) $event.returnValue='Your data will be lost!'; 
    } 
} 

与Günter's有两个主要区别答案:

  1. @HostListener的参数应该是window:beforeunload而不是window:onbeforeunload
  2. 处理程序不应该返回的消息,而应该将其分配到$event.returnValue代替
+0

此代码适用于我。不幸的是,当我关闭标签时,这不会在我的android手机中执行。有什么建议么? – brijmcq

+0

https://stackoverflow.com/questions/35779372/window-onbeforeunload-doesnt-trigger-on-android-chrome-alt-solution可能有帮助 –

+0

当'returnValue'不是'null'时,对话框会显示。而且大多数交叉口现在向用户显示一条通用信息。所以你无法改变它。 –

相关问题