UI 路由器在不更改 url 的情况下更改状态

UI-router change state without changing url

本文关键字:情况下 状态 url 路由器 UI      更新时间:2023-09-26

有人知道如何在不更改 url 的情况下更改 ui 路由器状态吗?如下面的代码所示;在某些情况下,需要将用户重定向到 403 或 401 状态。我希望能够在不更改 url 的情况下进行此重定向。

问候荷兰皇家银行

// make sure authGetCurrent has ran before routing starts
$rootScope.$on("$locationChangeSuccess", function(event, next) {
    event.preventDefault();
    AuthService.loadCurrentAuth().then(function(){
        $urlRouter.sync();
    }, function(){
        console.log("BIG ERROR!!!");
    });
});
// Configures $urlRouter's listener *after* your custom listener
$urlRouter.listen();


$rootScope.$on("$stateChangeStart", function(event, toState, toParams, fromState, fromParams) {
    var requiredLogin       = (toState && toState.data ? toState.data.requiredLogin       : false ),
        requiredGroupRights = (toState && toState.data ? toState.data.requiredGroupRights : false );        // require the user to have at least one of these rights in the current group
    if (requiredLogin && !AuthService.isLoggedIn()) {
        event.preventDefault();
        $state.transitionTo('401');
        return;
    }
    if(requiredGroupRights){
        var i,
            hasRight = false;
        for(i=0;i<requiredGroupRights.length;i++){
            if(GroupService.checkGroupRights(toParams.groupId, requiredGroupRights[i])){
                hasRight = true;
                break;
            }
        }
        if(!hasRight){
            event.preventDefault();
            $state.transitionTo('403');
            return;
        }
    }
});

{ location: false }选项传递给 $state.go

$state.go("home.foo", {}, { location: false } );

查看实际操作:http://plnkr.co/edit/w2aolrt9wdW3EFcEB3Lw?p=preview

var app = angular.module('demonstrateissue', ['ui.router']);
app.config(function($stateProvider, $urlRouterProvider) {
  $urlRouterProvider.otherwise("/home");
  $stateProvider.state({ 
    name: 'home', 
    url: '/home', 
    controller: function() { }, 
    template: '<h1>Home</h1><div ui-view></div>'}
  );
  $stateProvider.state({ 
    name: 'home.foo', 
    url: '/foo', 
    controller: function() { }, 
    template: '<h1>foo</h1>'}
  );
});
// Adds state change hooks; logs to console.
app.run(function($rootScope, $state, $location) {
  $rootScope.$state = $state;
  $rootScope.$location = $location;
  // This function will go to home.foo state but not change url
  $rootScope.gotofoo = function() { 
    $state.go("home.foo", {}, { location: false } );
  };
});
<!DOCTYPE html>
<html>
  <head>
    <script data-require="angular.js@*" data-semver="1.2.25" src="https://code.angularjs.org/1.2.25/angular.js"></script>
    <script data-require="ui-router@*" data-semver="0.2.13" src="https://rawgit.com/angular-ui/ui-router/0.2.13/release/angular-ui-router.js"></script>
  </head>
  <body ng-app="demonstrateissue">
      <div ui-view>/div>  
      <div class="header">
        Current URL: <b>{{$location.url()  }}</b> <br>
        Current State: <b>{{$state.current.name }}</b> <br>
        Current Params: <b>{{$state.params | json }}</b><br>
      </div>
      <!-- click this -->
      <a href ng-click="gotofoo()">Go to foo dont change url</a>
  </body>
</html>

如果你不想创建函数,你可以将一个对象传递给属性"ui-sref-opts",如下所示:

<a ui-sref="my-page" ui-sref-opts="{location:false}">My Page</a>

以下行(存在于angular-ui-router.js中)显示了允许的属性:

var allowedOptions = ['location', 'inherit', 'reload', 'absolute'];