เพื่อป้องกันการรีเฟรชเบราว์เซอร์การปิดหน้าต่าง ฯลฯ (ดูความคิดเห็นของ @ ChristopheVidal ต่อคำตอบของGünterสำหรับรายละเอียดเกี่ยวกับปัญหานี้) ฉันพบว่าการเพิ่ม@HostListener
มัณฑนากรในcanDeactivate
การใช้งานของชั้นเรียนของคุณเพื่อฟังbeforeunload
window
เหตุการณ์นั้นมีประโยชน์ เมื่อกำหนดค่าอย่างถูกต้องสิ่งนี้จะป้องกันทั้งในแอปและการนำทางภายนอกในเวลาเดียวกัน
ตัวอย่างเช่น:
ส่วนประกอบ:
import { ComponentCanDeactivate } from './pending-changes.guard';
import { HostListener } from '@angular/core';
import { Observable } from 'rxjs/Observable';
export class MyComponent implements ComponentCanDeactivate {
// @HostListener allows us to also guard against browser refresh, close, etc.
@HostListener('window:beforeunload')
canDeactivate(): Observable<boolean> | boolean {
// insert logic to check if there are pending changes here;
// returning true will navigate without confirmation
// returning false will show a confirm dialog before navigating away
}
}
ยาม:
import { CanDeactivate } from '@angular/router';
import { Injectable } from '@angular/core';
import { Observable } from 'rxjs/Observable';
export interface ComponentCanDeactivate {
canDeactivate: () => boolean | Observable<boolean>;
}
@Injectable()
export class PendingChangesGuard implements CanDeactivate<ComponentCanDeactivate> {
canDeactivate(component: ComponentCanDeactivate): boolean | Observable<boolean> {
// if there are no pending changes, just allow deactivation; else confirm first
return component.canDeactivate() ?
true :
// NOTE: this warning message will only be shown when navigating elsewhere within your angular app;
// when navigating away from your angular app, the browser will show a generic warning message
// see http://stackoverflow.com/a/42207299/7307355
confirm('WARNING: You have unsaved changes. Press Cancel to go back and save these changes, or OK to lose these changes.');
}
}
เส้นทาง:
import { PendingChangesGuard } from './pending-changes.guard';
import { MyComponent } from './my.component';
import { Routes } from '@angular/router';
export const MY_ROUTES: Routes = [
{ path: '', component: MyComponent, canDeactivate: [PendingChangesGuard] },
];
โมดูล:
import { PendingChangesGuard } from './pending-changes.guard';
import { NgModule } from '@angular/core';
@NgModule({
// ...
providers: [PendingChangesGuard],
// ...
})
export class AppModule {}
หมายเหตุ : ตามที่ @JasperRisseeuw ชี้ให้เห็น IE และ Edge จะจัดการbeforeunload
เหตุการณ์ที่แตกต่างจากเบราว์เซอร์อื่น ๆ และจะรวมคำfalse
ในกล่องโต้ตอบยืนยันเมื่อbeforeunload
เหตุการณ์เปิดใช้งาน (เช่นเบราว์เซอร์รีเฟรชปิดหน้าต่าง ฯลฯ ) การนำทางภายในแอป Angular ไม่ได้รับผลกระทบและจะแสดงข้อความเตือนการยืนยันที่คุณกำหนด ผู้ที่ต้องการสนับสนุน IE / Edge และไม่ต้องการfalse
แสดง / ต้องการข้อความรายละเอียดเพิ่มเติมในกล่องโต้ตอบยืนยันเมื่อbeforeunload
เหตุการณ์เปิดใช้งานอาจต้องการดูคำตอบของ @ JasperRisseeuw เพื่อหาวิธีแก้ปัญหา