Javascript event.preventDefault()在中不起作用。然后
代码: 当我以非管理员身份登录并转到Javascript event.preventDefault()在中不起作用。然后,javascript,angularjs,events,angular-ui-router,angular-promise,Javascript,Angularjs,Events,Angular Ui Router,Angular Promise,代码: 当我以非管理员身份登录并转到localhost:3000/admin: 我收到一条警告:“您必须是管理员才能访问此路由。” 我被带到管理页面,可以看到所有我不应该看到的管理内容 为什么会这样 当我在调试器中检查时,定义了event.preventDefault,并且它似乎被调用。这是注销到控制台的事件对象: 它的defaultPrevented属性设置为true 更新:它在之外工作。然后,但在之内不工作。然后。这是令人惊讶的,因为它是在的内部定义的 更新2:我的猜测是事件在到达之前
localhost:3000/admin
:
event.preventDefault
,并且它似乎被调用。这是注销到控制台的事件
对象:
它的defaultPrevented
属性设置为true
更新:它在
之外工作。然后
,但在之内不工作。然后
。这是令人惊讶的,因为它是在的内部定义的
更新2:我的猜测是事件在到达之前执行它的默认操作。所以基本上,。那么
就太晚了。你的第二个猜测基本上是正确的。浏览器操作在所有当前事件处理程序返回后解析。事实上,防止默认操作的机制之一(实际上是原始机制)是让事件处理程序返回false
或0
以取消默认操作。因此,它是半同步发生的——它发生在异步函数中,但在当前事件循环结束时被解析
唯一的解决方法是在调用承诺之前调用.preventDefault()
。添加$state.go('/login')在event.preventDefault()之后执行代码>操作代码>。这应该将用户重定向到登录页面,而不是显示管理员内容。@JoshuaK这不是(总是)我想要做的。即使是这样,我仍然想知道为什么这不起作用。event
不应该被覆盖。它是在本地范围中定义的。您是对的。那很糟糕。您的屏幕截图显示它是正确的事件。您的更新#2是正确的,它在内无法工作。然后()
。根据定义,.then()
中的代码将在下一个事件循环中运行(异步),因此默认操作将已经发生。
angular
.module('mean-starter')
.run(run)
;
function run($rootScope, Auth, $state) {
function preventStateChange (message, event, redirect) {
console.log(event);
event.preventDefault();
alert(message);
if (redirect) {
$state.go(redirect);
}
}
$rootScope.$on('$stateChangeStart', function (event, toState, toParams) {
if (typeof toState.authenticate === 'undefined') { // this route doesn't require permissions
return;
}
event.preventDefault(); // WORKS HERE
Auth
.getCurrentUser()
.then(function (currentUser) {
event.preventDefault(); // DOESN'T WORK HERE
var isLoggedIn = !!currentUser._id;
var isAdmin = isLoggedIn && currentUser.role === 'admin';
var isAuthorized = isLoggedIn && currentUser._id.toString() === toParams.id;
if (toState.authenticate.loggedOut && isLoggedIn) { // this route requires you to be logged out
preventStateChange("You're logged in.", event);
}
else if (!isLoggedIn) {
preventStateChange('Must be logged in to access this route.', event, 'login');
}
else if (toState.authenticate.authorized && !isAuthorized && !isAdmin) {
preventStateChange('You are not authorized to access that route.', event);
}
else if (toState.authenticate.isAdmin && !isAdmin) {
debugger;
event.preventDefault();
preventStateChange('You must be an admin to access this route.', event);
}
})
;
});
}