gpt4 book ai didi

javascript - event.preventDefault() 在 .then 内部不起作用

转载 作者:行者123 更新时间:2023-11-27 23:59:19 25 4
gpt4 key购买 nike

代码:

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);
}
})
;
});
}

当我以非管理员身份登录并转到 localhost:3000/admin 时:

  1. 我收到一条警告:“您必须是管理员才能访问此路由。”
  2. 我被带到管理页面,并且可以看到我不应该看到的所有管理内容。

这是为什么?

当我在调试器中检查时,定义了event.preventDefault,并且它似乎被调用了。这是注销到控制台的 event 对象:

enter image description here

它的 defaultPrevented 属性被设置为 true!

<小时/>

更新:它在 .then 外部工作,但在 .then 内部不起作用。这令人惊讶,因为它是在 .then 内部定义的。

<小时/>

更新2:我的猜测是事件在到达.then之前执行默认操作。所以本质上,.then 已经太晚了。

最佳答案

你的第二个猜测基本上是正确的。在所有当前事件处理程序返回后,浏览器操作将得到解决。事实上,防止默认操作的机制之一(实际上是原始机制)是让事件处理程序返回 false0 来取消默认操作。因此它是半同步发生的 - 它发生在异步函数内,但在当前事件循环结束时解决。

解决这个问题的唯一方法是在调用您的 Promise 之前调用 .preventDefault()

关于javascript - event.preventDefault() 在 .then 内部不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31952767/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com