Angular6:页面离开时的简单确认
Angular 6: simple confirmation on page leaving
我需要做一个简单的确认 window 并且我看到了很多关于如何通过额外的操作来完成它的例子(比如等到表单的文件上传不是字段)。但我只需要使用默认文本(如下图所示)进行默认确认 window,以便在用户想要离开当前页面时显示它。而且我不能完全理解我应该在处理 before unload
事件中证明什么逻辑。
最近很抱歉,如果它是某个问题的重复,但是,我没有找到任何解决方案。所以我有:
example.guard.ts
export interface CanComponentDeactivate {
canDeactivate: () => Observable<boolean> | boolean;
}
@Injectable()
export class ExampleGuard implements CanDeactivate<CanComponentDeactivate> {
constructor() { }
canDeactivate(component: CanComponentDeactivate): boolean | Observable<boolean> {
return component.canDeactivate() ?
true :
confirm('message'); // <<< does confirm window should appear from here?
}
}
example.component.ts
export class ExampleComponent implements CanComponentDeactivate {
counstructor() { }
@HostListener('window:beforeunload', ['$event'])
canDeactivate($event: any): Observable<boolean> | boolean {
if (!this.canDeactivate($event)) {
// what should I do here?
}
}
}
如果您能提供代码示例就太好了,但我很感激您提供的任何帮助。
您应该区分 beforeunload
window
上的本机事件和 canDeactivate 守卫。
当您尝试关闭 tab/window 时,第一个被触发。因此,当它被触发时,您可以 confirm(...)
用户并对其执行 event.preventDefault()
以取消关闭 tab/window.
谈论 CanDeactivate
保护它应该 return 一个 observable/promise/plain-value 布尔值,它将告诉您是否可以停用当前路线。
所以最好分开两种方法(一种用于beforeunload
,另一种用于守卫)。因为如果你想改变行为,不仅使用本机确认,而且你的自定义模式 window beforeunload
的默认事件处理程序将无法工作,因为它处理同步代码。所以对于 beforeunload
你只能使用 confirm
来要求用户不要离开页面。
loading = true;
@HostListener('window:beforeunload', ['$event'])
canLeavePage($event: any): Observable<void> {
if(this.loading && confirm('You data is loading. Are you sure you want to leave?')) {
$event.preventDefault();
}
}
另一方面,Guard 希望布尔值被 returned(或 Promise,
或可观察)。所以在这里你可以 return 你的条件的结果:
canDeactivate(): boolean {
return this.loading && confirm('You data is loading. Are you sure you want to leave?');
}
所以在你的CanDeactivate
守卫中它会像return component.canDeactivate()
一样使用
如果要求默认window确认信息。然后可以通过以下代码行实现。
/**
* Browser's default confirmation dialog box.
*/
@HostListener('window:beforeunload')
defaultConfirmation(): boolean {
if (!DIRTY_FORM_CHECK) return true;
else return false;
}
输出:
如果脏检查 return true,将显示默认确认对话框。
在没有脏的情况下,pop-up不会出现
希望这可能对某人有所帮助。谢谢
我需要做一个简单的确认 window 并且我看到了很多关于如何通过额外的操作来完成它的例子(比如等到表单的文件上传不是字段)。但我只需要使用默认文本(如下图所示)进行默认确认 window,以便在用户想要离开当前页面时显示它。而且我不能完全理解我应该在处理 before unload
事件中证明什么逻辑。
最近很抱歉,如果它是某个问题的重复,但是,我没有找到任何解决方案。所以我有:
example.guard.ts
export interface CanComponentDeactivate {
canDeactivate: () => Observable<boolean> | boolean;
}
@Injectable()
export class ExampleGuard implements CanDeactivate<CanComponentDeactivate> {
constructor() { }
canDeactivate(component: CanComponentDeactivate): boolean | Observable<boolean> {
return component.canDeactivate() ?
true :
confirm('message'); // <<< does confirm window should appear from here?
}
}
example.component.ts
export class ExampleComponent implements CanComponentDeactivate {
counstructor() { }
@HostListener('window:beforeunload', ['$event'])
canDeactivate($event: any): Observable<boolean> | boolean {
if (!this.canDeactivate($event)) {
// what should I do here?
}
}
}
如果您能提供代码示例就太好了,但我很感激您提供的任何帮助。
您应该区分 beforeunload
window
上的本机事件和 canDeactivate 守卫。
当您尝试关闭 tab/window 时,第一个被触发。因此,当它被触发时,您可以 confirm(...)
用户并对其执行 event.preventDefault()
以取消关闭 tab/window.
谈论 CanDeactivate
保护它应该 return 一个 observable/promise/plain-value 布尔值,它将告诉您是否可以停用当前路线。
所以最好分开两种方法(一种用于beforeunload
,另一种用于守卫)。因为如果你想改变行为,不仅使用本机确认,而且你的自定义模式 window beforeunload
的默认事件处理程序将无法工作,因为它处理同步代码。所以对于 beforeunload
你只能使用 confirm
来要求用户不要离开页面。
loading = true;
@HostListener('window:beforeunload', ['$event'])
canLeavePage($event: any): Observable<void> {
if(this.loading && confirm('You data is loading. Are you sure you want to leave?')) {
$event.preventDefault();
}
}
另一方面,Guard 希望布尔值被 returned(或 Promise, 或可观察)。所以在这里你可以 return 你的条件的结果:
canDeactivate(): boolean {
return this.loading && confirm('You data is loading. Are you sure you want to leave?');
}
所以在你的CanDeactivate
守卫中它会像return component.canDeactivate()
如果要求默认window确认信息。然后可以通过以下代码行实现。
/**
* Browser's default confirmation dialog box.
*/
@HostListener('window:beforeunload')
defaultConfirmation(): boolean {
if (!DIRTY_FORM_CHECK) return true;
else return false;
}
输出:
如果脏检查 return true,将显示默认确认对话框。 在没有脏的情况下,pop-up不会出现
希望这可能对某人有所帮助。谢谢