[解決済み] ページを離れる前に、未保存の変更点を警告する
質問
angular 2アプリの特定のページから離れる前に、保存されていない変更についてユーザーに警告したいのですが。通常、私は
window.onbeforeunload
しかし、これは単一ページのアプリケーションではうまくいきません。
angular 1では、このメソッドにフックできることがわかりました。
$locationChangeStart
イベントを発生させ
confirm
ボックスが表示されますが、angular 2 でこれを動作させる方法を示しているものはありませんし、このイベントがまだ存在するかどうかもわかりません。また
プラグイン
の機能を提供するag1用の
onbeforeunload
しかし、ag2 に使用する方法はまだ見つかっていません。
この問題に対する解決策を誰かが見つけていることを期待しています。どちらの方法でも、私の目的には問題なく機能します。
解決方法は?
ブラウザのリフレッシュやウィンドウのクローズなどに対するガードもカバーするために。(この問題の詳細については、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 さんの回答も参照してください。
関連
-
Angularフレームワーク入門
-
[解決済み] Angular 2のキープレスごとの変更イベント
-
[解決済み】Angular CLIが生成する「spec.ts」ファイルは何のためにあるのか?
-
[解決済み】エラー NG6002: AppModule の NgModule.imports に表示されるが、NgModule クラスに解決できなかった。
-
[解決済み] Angular 2のパッシブリンク - <a href="">相当
-
[解決済み] Angular HttpClient "パース中のHttp失敗"
-
[解決済み] Angular Materialダイアログエリアの外をクリックしてダイアログを閉じないようにする(Angularバージョン4.0以上で使用可能)
-
[解決済み] Angular2の変更検出:ネストされたオブジェクトに対してngOnChangesが発生しない
-
[解決済み] Angular Compiler は TypeScript >=3.4.0 と <3.5.0 を要求しているが、代わりに 3.5.3 が検出された
-
[解決済み] Angular 2のテンプレートでlet-*とは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Angularフレームワーク入門
-
[解決済み] CLIを使ったAngular 2 - 制作のためのビルド
-
[解決済み] formGroup' は 'form' の既知のプロパティではないため、バインドできません。
-
[解決済み] ngIf」は「div」の既知のプロパティではないため、バインドできない [重複] 。
-
[解決済み] 設定ファイルにng serveのデフォルトのホストとポートを設定する。
-
[解決済み] テンプレート駆動型とリアクティブ型の実用的な違いとは?
-
[解決済み] NgModule.schemasにCUSTOM_ELEMENTS_SCHEMAを追加してもエラーが表示される。
-
[解決済み] Angularアプリケーションが本番モードと開発モードのどちらで動作しているかを確認する方法
-
[解決済み] Angular HttpClient "パース中のHttp失敗"
-
[解決済み] Angular 2のテンプレートでlet-*とは何ですか?