AngularJS:$ previousState在$ stateChangeStart期间未发现阻止状态转换

时间:2014-12-11 16:29:03

标签: angularjs angular-ui-router angular-ui-router-extras

我有一个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;尽管如此,过渡并没有发生。

我该如何避免这种情况?

1 个答案:

答案 0 :(得分:0)