私は ui-router とui-router-extrasを使用する AngularJS アプリケーションを持っています。そこでは、状態間のいくつかの遷移がインターセプトされ、別のものにリダイレクトされます。
基本的に、$stateChangeStart
イベントがトリガーされると、アプリはその遷移が許可されているかブロックする必要があるかを確認し、ユーザーを別の場所にリダイレクトします (例: ログイン ダイアログ、プロセスのステップの欠落など)。トランジションをキャンセルすることもできます。
傍受は次のように機能します。
$rootScope.$on("$stateChangeStart", function(e,to,toParams,from,fromParams){
if( <mustBeIntercepted> || <mustBeCancelled> ){
// this prevents the actual state change from happening
e.preventDefault();
if( <redirectionRequired> ){
$state.go( <stateName>, <stateParams>);
}
}
});
そして、これはこれまでのところうまく機能しています。問題は$previousState
、遷移をキャンセルしない場合と同じように、状態の変更をキャンセルするときに、 がキャンセルを認識せず、現在の状態を以前の状態として登録することです。なので基本的$previousState
に遷移解除は意識していません。これにより、プログラムで前の状態に戻ろうとすると、$state
==のため移動しません$previousState
。
ここでライブ デモを作成しました: http://plnkr.co/edit/dXjj2iSwDU1DtPMuqW1W?p=preview
基本的に、Step1をクリックしてからConfirmをクリックすると、アプリは遷移をキャンセルし、確認するかどうかを尋ねます。確認すると、本来の状態に遷移します。実際のアプリでは、これは行われませんconfirm
が、同じ方法で回答をブロックできないカスタム オーバーレイを使用して行われることに注意してくださいconfirm
。
お気づきのように、上部のバーには と の内容を示す 2 つのラベルが$state
あり$previousState
ます。confirm
プロンプトをキャンセルする$previousState
と、移行が行われなかったにも関わらず、「Step1」への変更が表示されます。
どうすればこれを回避できますか?