【问题标题】:Angular function is not using explicit annotation and cannot be invoked in strict modeAngular 函数未使用显式注释,无法在严格模式下调用
【发布时间】:2016-08-09 05:17:32
【问题描述】:

在我的网络应用程序中,我想验证用户是否有权继续。

这是我的 index.js 文件中的 .run 方法:

  .run(function (event, toState, toParams, fromState, $window) {
$rootScope.$on('$stateChangeStart', function(event, toState, toParams, fromState, $window) {
  if (Auth.isLoggedIn && $window.localStorage.identityToken) {

    var requiredAdmin = toState.data.requiredAdmin; 
    if (requiredAdmin && $window.localStorage.isAdmin){
      $state.go(toState.name);
    } else {
      $state.go(fromState.name);
    }
    var shouldGoToMain = fromState.name === 'login' && toState.name !== 'app.dashboard' ;

    if (shouldGoToMain){
      $state.go('app.dashboard');
      event.preventDefault();
    } else {
      $state.go(toState.name);
    }
    return;
  } else { 
    $state.go('login');
    return;
  }

  // unmanaged
});

});

控制台错误为:Uncaught Error: [$injector:strictdi] function(event, toState, toParams, fromState, $window) is not using explicit annotation and cannot be invoked in strict mode

【问题讨论】:

    标签: angularjs angularjs-injector


    【解决方案1】:

    您启用了strict mode,以检测您忘记使用 $inject 或数组表示法的位置,以确保您的代码可以安全地缩小。

    该消息告诉您未能正确注释您的可注入函数。请注意,除此之外,您的代码没有多大意义:

    • 传递给 run() 的函数应该以可注入服务作为参数,并且它的所有参数除了 $window 之外都不是服务。
    • 传递给 $on() 的函数不是可注入函数。所以传递它 $windows 是没有意义的。路由器只会使用前 4 个参数调用它。

    所以,你的代码应该是:

    .run(['$rootScope', '$window', function($rootScope, $window) {
        $rootScope.$on('$stateChangeStart', function(event, toState, toParams, fromState) { 
    

    我强烈建议您停止手动注释您的可注入函数,并使用ng-annotate 为您执行此操作。

    【讨论】:

    • 它可以工作,但控制台给了我这个错误:$state.go 不是一个函数。为什么? (我还添加了对您代码的两个依赖项: .run(['$rootScope', '$window', function($rootScope, $window) { $rootScope.$on('$stateChangeStart', function(event, toState, toParams, fromState, Auth, $state) )
    • 你又犯了同样的错误。传递给 $on 的方法不是可注入函数。将 Auth 和 $state 传递给该函数根本没有意义。这些服务应该注入到传递给 run() 的函数中(因此它们的名称也应该添加到数组中)
    • 完成!但我有一个奇怪的本地错误......当它转到 else { $state.go('login'); } 它返回到 if (Auth.isLoggedIn && $window.localStorage.identityToken),然后转到 $state.go('login') 并返回 if (Auth....) 并继续直到浏览器崩溃...如果你愿意,我把所有的代码都推到这里了:stackoverflow.com/questions/36677234/…
    • 嗯,这是意料之中的:您希望每次路由器进入某个状态时都执行此代码。最后,您告诉路由器进入“登录”状态。如果请求的状态是“登录”,则不应执行 else 块。
    • 我在 'if' 块中遇到了同样的问题... $state.go('app.dashboard')、$state.go(fromState.name) 等等...我只是想做一个代码来检查用户是否有权限......然后,如果他有权限,让他继续......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-27
    • 1970-01-01
    • 2017-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多