从服务器重定向到具有相同URL的不同ui-router状态?

时间:2015-07-08 08:40:06

标签: angularjs angular-ui-router state

目前我有一个州' home'它位于网址'。用户连接后,'客户端'状态已加载,也位于网址' /'并且会话已更新。是否有可能使其成为如果用户重新加载页面,“客户端”#39;立即加载状态而不是“家”。州?如果他们在不同的网址,我可以简单地让服务器执行重定向,但我希望他们都在基本网址' /'。在ui-router中是否有一些功能可以让我实现这个目标?

以下是我的陈述:

  app.config(function($stateProvider, $urlRouterProvider,$locationProvider) {

    $stateProvider
    .state('home', {
      url: '/',
      controller: 'HomePageConroller as homeCtrl',
      templateUrl: '/views/partials/home.html',
      onEnter: function($http,$state) {
        $http.post('/checkconnected')
        .success(function(data,status) {
          if (data) {$state.go('client');}
        });
      }
    })

    .state('client', {
      url: '/',
      controller: 'ClientController as clientCtrl',
      templateUrl: '/views/partials/client.html'
    });

正如您所看到的,我正在向服务器发送支票,以查看客户端是否已连接,然后从角度应用程序中进行重定向,但我对此解决方案根本不满意。帖子需要时间,因此在显示客户端页面之前,主页已完全加载并被用户看到。

我考虑过的一个解决方案就是拥有另一个名为“客户端重定向”的状态。确实存在于' / client'并且具有与'客户端相同的模板。 state,在输入时执行相同的$ state.go而不需要$ http.post(因为服务器已根据更新的会话重定向)。这样可以消除延迟并且不会使主屏幕闪烁,但它看起来并不优雅。

2 个答案:

答案 0 :(得分:0)

答案 1 :(得分:0)

好的,这就是我解决这个问题的方法。我将'client'的网址从'/'重命名为'/ client'。在我的服务器上,get请求检查用户是否已连接并重定向到获取'/ client'(如果是这样)(这使得完全相同的角应用只有url不同)。然后我修改了我的客户端以声明onEnter change $ location.path()。实现这几乎和$ state.go一样,我使用$ stateChangeStart的事件处理程序来阻止状态转换。最终代码如下所示:

  app.config(function($stateProvider, $urlRouterProvider,$locationProvider) {

    $stateProvider
    .state('home', {
      url: '/',
      controller: 'HomePageConroller as homeCtrl',
      templateUrl: '/views/partials/home.html'
    })

    .state('client', {
      url: '/client',
      controller: 'ClientController as clientCtrl',
      templateUrl: '/views/partials/client.html',
      onEnter: function($location){$location.path('/');}
    });

    $urlRouterProvider.otherwise('/');
    $locationProvider.html5Mode(true);
  });

  app.run(['$rootScope', function($rootScope) {
    $rootScope.$on('$stateChangeStart', function(event, toState, toParams, fromState, fromParams){ 
      if (fromState.name == 'client' && toState.name == 'home') {
        event.preventDefault();
      }
    });
  }]);

如果我可以进一步清理,请在下面评论。

相关问题