我正在尝试使用AngularUI路由器进行一些身份验证。$urlRouter.sync()
看起来正是我所需要的。但是,仅当我拦截时可用$locationChangeSuccess
。但是当我这样做时,它$state.current.name
是空的,而我希望它是当前状态。
到目前为止,这是我的代码:
$rootScope.$on('$locationChangeSuccess', function(event, next, nextParams) {
event.preventDefault();
if ($state.current.name === 'login') {
return userService.isAuthenticated().then(function(response) {
var authenticated;
authenticated = response.authenticated;
return alert(authenticated);
});
}
});
关于我在做什么错的任何指示?
我建议走更多的UI- Router
路。我们应该使用适当提供的$rootScope.$on('$stateChangeStart'
事件$state.current
。这是一个有效的例子
让我们观察一下简单的 (但不是幼稚的) 解决方案,它可以在以后扩展到任何程度。
首先,让我们定义用户服务,如下所示:
.factory('userService', function ($timeout, $q) {
var user = undefined;
return {
// async way how to load user from Server API
getAuthObject: function () {
var deferred = $q.defer();
// later we can use this quick way -
// - once user is already loaded
if (user) {
return $q.when(user);
}
// server fake call, in action would be $http
$timeout(function () {
// server returned UN authenticated user
user = {isAuthenticated: false };
// here resolved after 500ms
deferred.resolve(user)
}, 500)
return deferred.promise;
},
// sync, quick way how to check IS authenticated...
isAuthenticated: function () {
return user !== undefined
&& user.isAuthenticated;
}
};
})
因此,我们使用async _(此处为$timeout
)_从user
服务器加载对象。在我们的示例中,它将具有属性{isAuthenticated: false }
,该属性将用于检查是否已通过身份验证。
还有一个sync方法isAuthenticated()
,直到加载并允许用户-始终返回false
。
那将是我们对'$stateChangeStart'
事件的听众:
.run(['$rootScope', '$state', 'userService',
function ($rootScope, $state, userService) {
$rootScope.$on('$stateChangeStart', function (event, toState, toParams
, fromState, fromParams) {
// if already authenticated...
var isAuthenticated = userService.isAuthenticated();
// any public action is allowed
var isPublicAction = angular.isObject(toState.data)
&& toState.data.isPublic === true;
if (isPublicAction || isAuthenticated) {
return;
}
// stop state change
event.preventDefault();
// async load user
userService
.getAuthObject()
.then(function (user) {
var isAuthenticated = user.isAuthenticated === true;
if (isAuthenticated) {
// let's continue, use is allowed
$state.go(toState, toParams)
return;
}
// log on / sign in...
$state.go("login");
})
...
我们首先要检查的是用户是否已经加载并通过身份验证 (var isAuthenticated = ...
)。接下来,我们将为任何公共方法赋予绿色。这是通过data {}
状态对象定义的属性完成的(请参阅将自定义数据附加到状态对象)
就是这样。在下面的代码段中定义状态的情况下,我们可以体验到:
'public'
,'home'
允许任何人'private'
,'private'
如果出现以下情况,将重定向到登录名isAuthenticated === false
在'login'
这个例子提供了快捷的方法如何打开/关闭isAuthenticated
// States
$stateProvider
// public
.state(‘home’, {
url: “/home”,
templateUrl: ‘tpl.html’,
data: { isPublic: true },
})
.state(‘public’, {
url: “/public”,
templateUrl: ‘tpl.html’,
data: { isPublic: true },
})
// private
.state(‘private’, {
url: “/private”,
templateUrl: ‘tpl.html’,
})
.state(‘private2’, {
url: “/private2”,
templateUrl: ‘tpl.html’,
})
// login
.state(‘login’, {
url: “/login”,
templateUrl: ‘tpl.html’,
data: { isPublic: true },
controller: ‘loginCtrl’,
})
检查所有这里
问题内容: 和之间有什么区别? 它们都是与相关的未记录事件。 问题答案: 在当AngularJS开始更新浏览器的位置基于突变通过完成烧制服务(,)。 应用程序可能会监听该事件并对其进行调用,这可能会发生。在这种情况下,第二个事件()将不会广播。 简而言之:位置更新时触发。如果未阻止第一个操作,则执行此操作。 源代码的相关位在此处:https : //github.com/angular/angul
问题内容: 我不知道什么是这三个不同,与其相应的,和。 问题答案: $ locationChangeStart: 这使用提供程序并在URL更改时广播。位置更多是指特定URL的路径。它更像普通的JavaScript,您可以更改到应用程序中的任何路径,并且在应用程序中将其定义为路由还是状态都没有关系。 $ routeChangeStart: 这使用提供程序,并且与更改路由时使用的提供程序相同(与一起使
我在理解密钥库和信任库的概念方面有问题。 哪个应用程序保留keystore,哪个应用程序保留truststore? 我在网上找不到任何好的资源。如果有人能清楚地描述truststore和KeyStore之间的区别,我会非常感激吗?
我想在Windows中使用WebMvcConfigurerAdapter添加资源处理程序,但在Linux中不起作用,所以我添加。 经过调试和测试,我发现两个bean都将在两个OS中创建,但是的重写函数只能在Windows中执行,的重写函数只能在Linux中执行。 这是另一个: @enalbemvc已添加到主类中
问题内容: 是否有人将Hamcrest与TestNG集成在一起,以便其匹配器可以轻松地用于TestNG断言中? 问题答案: 简而言之,要回答您的问题:您不需要将TestNG与Hamcrest集成。只需直接调用哪个抛出。 背景 我通过Google找到了您的问题,想知道完全一样的问题。在进一步谷歌搜索之后,我没有找到满意的答案,因此我阅读了JUnit与Hamcrest集成的源代码。 对于JUnit,通
问题内容: 我一直在用Python开发一个库,我想做一些性能改进。 是否可以在Python中编写一些代码并在Go中编写一些代码,并在它们之间传递数据?如果可能的话,是否有任何有关此操作的示例? 像这样: 问题答案: 你需要一个 胶 之间,例如编程语言或通信通过网络。如果您将https://docs.python.org/2/extending/extending.html与http://golan