如果设置了位置,如何在每个状态下检查路由器ui,如果没有,则转到登录页
How to check in router-ui on each state if location is set, if not then go to landing page?
如何在angular router ui中实现以下场景:除了登录页面用户无法浏览没有位置的页面。无论用户是否登录,如果设置了位置,请检查每个状态更改,如果没有,则转到登录页。如果用户已登录并有位置,则设置cookie,如果没有,则转到登录页。
我目前的概念,但它不起作用,是否完全正确?
var app = angular.module('myApp', ['ngCookies', 'ui.router', 'Devise', 'ngResource']);
app.config([
'$stateProvider', '$urlRouterProvider' '$cookies', function ($stateProvider, $urlRouterProvider, $cookies) {
$stateProvider.state('home', {
url: '/home',
templateUrl: 'home/_home.html',
controller: 'MainCtrl'
}).state('landing', {
url: '/landing',
templateUrl: 'landing.html',
controller: 'landing',
resolve: {
location: [
'$state ', '$stateParams', '$q', '$window', '$cookies', function ($state, $stateParams, $q, $window, $cookies) {
var deferred = $q.defer();
$window.navigator.geolocation.getCurrentPosition(function (position) {
$cookies.location = position;
deferred.resolve(position);
});
return deferred.promise;
}]
}
}).state('login', {
url: '/login ',
templateUrl: 'auth/_login.html ',
controller: 'AuthCtrl',
onEnter: [
'$state', 'CustomAuth', function ($state, CustomAuth, $cookies) {
CustomAuth.currentUserResource().then(function (resp) {
$cookies.location = resp.data.user.location;
$state.go('home');
});
}]
})
$urlRouterProvider.otherwise('home');
}]);
app.run(function($rootScope, $cookies) {
$rootScope.$on('$stateChangeStart', function(event, toState) {
if (!$cookies.location) {
event.preventDefault();
$state.go('landing');
}
});
});
有一个工作示例。我们不得不做一些调整。
首先,我们需要正确设置监听器。当已经复述时,不得重定向
app.run(['$rootScope', '$state', '$cookies',
function($rootScope, $state, $cookies) {
$cookies.location = "";
$rootScope.$on('$stateChangeStart', function(event, toState) {
if(toState.name === "landing")
{
// already was redirected
// we head to landing
// get out of hee
return;
}
if ($cookies.location === "")
{
event.preventDefault();
$state.go('landing');
}
});
}]);
此外,$cookies不是提供商,而是一项服务。这意味着,我们不能在.config()
阶段使用它,而只能在.run()
阶段使用它。
这意味着,它可以被注入到.run()
方法、controller()
或一些其他服务中,但不能被注入.config()
中
调整了定义,修复了许多小问题:
.config(['$stateProvider', '$urlRouterProvider',
function ($stateProvider, $urlRouterProvider) {
$stateProvider.state('home', {
url: '/home',
templateUrl: 'tpl.html',
controller: 'MainCtrl'
})
.state('landing', {
url: '/landing',
templateUrl: 'tpl.html',
controller: 'landing',
resolve: {
location: [
'$state', '$stateParams', '$q', '$window', '$cookies'
, function ($state, $stateParams, $q, $window, $cookies) {
var deferred = $q.defer();
// example how to quickly set some value
$cookies.location = "some position";
deferred.resolve($cookies.location);
return deferred.promise;
}]
}
})
.state('login', {
url: '/login ',
templateUrl: 'tpl.html',
controller: 'AuthCtrl',
...
})
$urlRouterProvider.otherwise('home');
}])
检查此处的工作示例
相关文章:
- 如何知道元素在屏幕上是否可见.如果没有,请滚动页面
- 可以转换显示属性吗?如果没有,什么'这是最好的解决方案
- 如果没有互联网连接,Android WebView离线消息
- 如果没有历史记录,我如何隐藏图像或按钮onclick=;历史.go(-1);
- 如果没有从下拉列表中选择任何值,则允许使用php、mysql、javascript将文本框添加到mysql表中
- 如果没有Ember中的控制器,我如何更改查询参数
- 如果没有添加PHP&Javascript
- 如果没有其他函数链接到promise,则默认行为
- 如果没有document.ready(),我怎么能拥有多个javascript函数呢
- 如果没有任何输入,如何启用按钮
- 有没有一个javascript库可以生成这样的垂直切片背景图像?如果没有,我怎么能创建它
- Jquery自动完成:如果没有选择任何项目,则使tab键选择第一个项目
- 如果设置了位置,如何在每个状态下检查路由器ui,如果没有,则转到登录页
- 如何从网站获得apple touch图标,如果没有;不存在,则显示收藏夹
- 自动单击按钮(如果没有类)
- 我可以通过使用函数绑定来保留默认值吗?如果没有,为什么
- 找到所有元素,如果没有类,则使用 jQuery 添加其他类
- ng,如果没有捕获更新的$scope值
- 角度 ui 类型提前建议 + 如果没有结果,则保留
- 如果使用UI-Bootstrap's typeahead指令没有找到匹配项,则窗体不可编辑