Angular UI Router:家庭的嵌套状态,用于区分登录和注销

use*_*349 6 angularjs angular-ui-router

我正在使用MEAN.JS(不是.IO)提供的样板MEAN开始一个新项目.
我是ui-router的新手,我无法弄清楚如何完成这个场景:

  • 如果用户已登录,请转到"home.loggedIn"状态.
  • 如果用户已注销,请转到"home.loggedOut"状态
  • 路径网址为"/",不应更改.

以下是路由提供商目前的样子:

angular.module('core').config(['$stateProvider', '$urlRouterProvider',
function($stateProvider, $urlRouterProvider) {
    // Redirect to home view when route not found
    $urlRouterProvider.otherwise('/');

    // Home state routing
    $stateProvider.
    state('home', {
      url: '/',
      abstract: true
    }).
    state('home.loggedOut', {
      templateUrl: 'modules/core/views/home.client.view.html'
    }).
    state('home.loggedIn', {
      templateUrl: 'modules/core/views/dashboard.client.view.html'
    });
  }
]);
Run Code Online (Sandbox Code Playgroud)

我正在寻找类似db语言中的预保存挂钩来确定要转到哪个状态.那会是什么样子?

Rad*_*ler 4

有一个plunker提供了如上所述的行为。首先,状态定义发生了变化,将url抽象状态移至两个子状态,并引入登录状态以供以后检查:

  // Redirect to home view when route not found
  $urlRouterProvider.otherwise('/');

  // Home state routing
  $stateProvider.
  state('home', {
    //url: '/',
    abstract: true,
    template: '<div ui-view=""></div>',
  }).
  state('home.loggedOut', {
    url: '/',
    ...
  }).
  state('home.loggedIn', {
    url: '/',
    ...
  })
  .state('logon', {
    url: '/logon',
    templateUrl: 'tpl.logon.html',
    controller: 'LogonCtrl',
  });
Run Code Online (Sandbox Code Playgroud)

我们现在所拥有的是具有相同 url 的 2 个状态的定义。第一个将被视为默认值..并使用。

现在,我们必须引入一个状态更改观察器,它将根据 AuthSvc 设置isLoggedIn重定向到正确的子状态:

.run(['$rootScope', '$state', 'AuthSvc', 
 function($rootScope, $state, AuthSvc) {

  $rootScope.$on('$stateChangeStart', function(event, toState, toParams
                                                  , fromState, fromParams) {

    // logged out is logged out
    var doRedirectToLoggedOut = !AuthSvc.isLoggedIn 
              && toState.name === "home.loggedIn";

    if (doRedirectToLoggedOut) {
        event.preventDefault();
        $state.go("home.loggedOut");
    }

    // logged in is logged in
    var doRedirectToLoggedIn = AuthSvc.isLoggedIn 
              && toState.name === "home.loggedOut";

    if (doRedirectToLoggedIn) {
        event.preventDefault();
        $state.go("home.loggedIn");
    }
  });
}])
Run Code Online (Sandbox Code Playgroud)

如此示例所示,在我们更改isLoggedIn(单击登录链接)之前,我们会被重定向到正确的子状态...即使我们想查看其他状态