目前我有一个州' 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(因为服务器已根据更新的会话重定向)。这样可以消除延迟并且不会使主屏幕闪烁,但它看起来并不优雅。
答案 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();
}
});
}]);
如果我可以进一步清理,请在下面评论。