【发布时间】:2016-08-14 06:33:47
【问题描述】:
Angular2中有没有像window.onbeforeunload这样的生命周期钩子? 我已经在 stackoverflow 上搜索并搜索过,但一无所获
【问题讨论】:
Angular2中有没有像window.onbeforeunload这样的生命周期钩子? 我已经在 stackoverflow 上搜索并搜索过,但一无所获
【问题讨论】:
在 Angular 中,我们可以创建类似的东西。
@HostListener('window:beforeunload')
confirmLeavingPageBeforeSaving(): boolean {
// if 0 display dialog
// if 1 you can reload
return !this.myBoolean;
}
【讨论】:
<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/en-US/docs/Web/API/WindowEventHandlers/onbeforeunload
【讨论】:
这对我有用。在页面组件构造函数中定义
window.addEventListener("beforeunload", (event) => {
event.preventDefault();
event.returnValue = "Unsaved modifications";
return event;
});
仅当您想在卸载前提示用户时才定义returnValue。
仅当用户与页面交互(例如点击)时才起作用。
【讨论】:
localStorage.removeItem())
这更像是一个补充说明而不是一个答案,但我现在无法真正发表评论。
不过,我想补充一下:
我不会说初始化逻辑太复杂,但如果您决定在组件初始化时添加事件侦听器,最好将其包含在 ngOnInit 而不是构造函数中:
window.addEventListener('beforeunload', function (e) {
e.preventDefault();
e.returnValue = '...';
});
尤其是如果您在卸载之前包含其他逻辑。
ngOnDestroy 上还有一篇很好的文章,它的作用类似于指令、管道和服务的析构函数。这两种方法都很方便,具体取决于您希望执行的操作。
完整链接文字:
https://wesleygrimes.com/angular/2019/03/29/making-upgrades-to-angular-ngondestroy.html
归功于 Günter Zöchbauer 的原始答案
【讨论】:
iOS的重要提示
beforeunload 事件不应该发生 - 可能是由于“滥用”程度较高
多年来。
这是Page visibility API 的一部分。
https://developer.mozilla.org/en-US/docs/Web/API/Page_Visibility_API
所以我似乎无法让pagehide 在桌面 chrome 上触发,我也无法让beforeunload 在 iOS Safari 上触发 - 所以你需要两者 - 但请确保不要触发你的代码两次。
@HostListener('window:beforeunload')
@HostListener('window:pagehide')
【讨论】:
@HostListener('window:pagehide', ['$event']) onClose($event) { console.log('hello') } 所以你不需要同时使用两者
Günter 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 的回答有两个主要区别:
@HostListener 的参数应该是 window:beforeunload 而不是 window:onbeforeunload$event.returnValue
【讨论】:
$event.returnValue=true;。任何其他值都不起作用(false、null、字符串等)。
@HostListener('window:beforeunload', ['$event']) handleUnload(e) { e.preventDefault(); e.returnValue = 'Wait!';}