簡単な確認ウィンドウを作成する必要があり、追加のアクション(フォームのファイルアップロードがフィールドでなくなるまで待つなど)を使用してそれを行う方法の例をたくさん見ました。しかし、ユーザーが現在のページから離れたいときに表示するために、デフォルトのテキスト(下の写真のように)でデフォルトの確認ウィンドウを作成する必要があります。そして、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ガードを区別する必要があります。タブ/ウィンドウを閉じようとすると、最初のものがトリガーされます。そのため、トリガーされたときにconfirm(...)
ユーザーとevent.preventDefault()
を実行して、タブ/ウィンドウを閉じることをキャンセルできます。
CanDeactivate
ガードについて話すと、現在のルートを非アクティブ化できるかどうかを示すブール値のobservable/promise/plain-valueを返す必要があります。
したがって、2つのメソッド(1つはbeforeunload
用、もう1つはガード用)を分離することをお勧めします。必要に応じて、ネイティブ確認だけでなくカスタムモーダルウィンドウを使用するように動作を変更すると、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は、ブール値(またはPromise、またはObservable)が返されることを望んでいます。したがって、ここでは、条件の結果を返すことができます。
_canDeactivate(): boolean {
return this.loading && confirm('You data is loading. Are you sure you want to leave?');
}
_
CanDeactivate
ガードでは、return component.canDeactivate()
のように使用されます。