또한 브라우저 새로 고침, 창 닫기 등을 방지하기 위해 (문제에 대한 자세한 내용은 Günter의 답변에 대한 @ChristopheVidal의 의견 참조) 이벤트 를 수신하기 위해 @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의 답변을 볼 수도 있습니다.