私はデュランダル アプリケーションを使用router.mapUnknownRoutes
しており、URL が既知のルートに対応していない場合に、ユーザー フレンドリーなエラー ページを表示するために使用しています。これは問題なく動作します。たとえば/foo
、 に移動し、それがルートと一致しない場合、 で指定されたモジュールmapUnknownRoutes
が正しく表示されます。
ただし、パラメーター化されたルートがあり、パラメーターがバックエンドの何にも一致しない場合、同じエラー ページを表示する方法が見つかりません。
たとえばpeople/:slug
、対応するモジュールのactivate
メソッドが次のように見えるルートがあるとします。
this.activate = function (slug) {
dataService.load(slug).then(function () {
// ... set observables used by view ...
});
};
たとえば に移動すると/people/foo
、結果は、dataService.load('foo')
データを返すかエラーを返すかによって異なります。
foo
バックエンドに存在する場合は問題ありません。オブザーバブルが設定され、構成が続行されます。foo
が存在しない場合、エラーがスローされます ( がないため)catch
。これにより、未処理のエラーが発生し、ナビゲーションがキャンセルされ、ルーターが機能しなくなります。
false
から戻ることができcanActivate
、ルーターを中断することなく、よりクリーンな方法でナビゲーションがキャンセルされることを知っています. ただし、これは私が望んでいるものではありません。何か問題が発生したことをユーザーに伝えるために、無効な URL が必要です。
{ redirect: 'not-found' }
から戻るか、似たようなことができることを知っていcanActivate
ます。ただし、これは戻るボタンを壊すため、ひどいものです。リダイレクトが発生した後、ユーザーが戻るを押す/people/foo
と、別のエラーが発生し、別のリダイレクトが に戻りnot-found
ます。
私はいくつかの異なるアプローチを試しましたが、主catch
に promise 定義への呼び出しを追加することを含みます。
this.activate = function (slug) {
dataService.load(slug).then(function () {
// ... set observables used by view ...
}).catch(function (err) {
// ... do something to indicate the error ...
});
};
activate
(またはcanActivate
) は、最初から一致しなかったかのように、ルートが実際には無効であることをルーターに通知 できますか?- URL を変更せずにルーターが別のモジュールを表示するように、
activate
(または) は( ではなく) をcanActivate
発行できますか?rewrite
redirect
- 現在のモジュールの代わりに他のモジュールを直接指定できます
compose
か (そして現在のモジュールの構成をキャンセルできますか)?
catch
また、エラーを飲み込む空のブロックも試しました(ここにトーストを追加して、ユーザーに通知することができます。これは、何もないよりはましです)。ただし、ビューで期待されるオブザーバブルが設定されないため、これにより多くのバインディング エラーが発生します。ビュー全体をバインドでラップしてエラーを防止できる可能性がありますif
が、これにより、エラー メッセージではなく空白のページが表示されます。または、データの取得に失敗する可能性のあるすべてのビューにエラー メッセージを表示する必要があります。いずれにせよ、これはビューの汚染であり、DRY ではありません。なぜなら、「見つかりません」というエラー メッセージは 1 回だけ表示する必要があるからです。
無効な URL (具体的には、ルートに一致するが無効なパラメーター値を含む URL) が「ページが見つかりません」というページを表示するようにしたいだけです。これは他の人も望んでいることではないでしょうか?これを達成する方法はありますか?