我有一个AngularJS应用程序,它使用ui-router和ui-router-extras,其中一些状态之间的转换被拦截并重定向到另一个转换。
所以基本上,当触发$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
相同的方式阻止答案。
正如您将注意到的,在顶部栏中有两个标签显示$state
和$previousState
的内容。如果您取消confirm
提示,您会看到$previousState
更改为&#34; Step1&#34;尽管如此,过渡并没有发生。
我该如何避免这种情况?