Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript event.preventDefault()在中不起作用。然后_Javascript_Angularjs_Events_Angular Ui Router_Angular Promise - Fatal编程技术网

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