Функция Angular не использует явную аннотацию и не может быть вызвана в строгом режиме.

В моем веб-приложении я хочу проверить, есть ли у пользователя права на продолжение.

Это метод .run в моем файле index.js:

  .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


person panagulis72    schedule 17.04.2016    source источник


Ответы (1)


Вы включили строгий режим, чтобы определить, где вы забыли использовать $inject или нотация массива, чтобы убедиться, что ваш код может быть безопасно минимизирован.

В сообщении говорится, что вы не смогли правильно аннотировать свои вводимые функции. Обратите внимание, что в дополнение к этому ваш код не имеет особого смысла:

  • предполагается, что функция, передаваемая в run(), принимает в качестве аргумента внедряемые службы, и все ее аргументы, кроме $window, не являются службами.
  • функция, переданная в $on(), не является внедряемой функцией. Так что передавать $windows не имеет смысла. Маршрутизатор вызовет его только с 4 первыми аргументами.

Итак, ваш код должен быть:

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

Я бы настоятельно рекомендовал прекратить аннотировать вводимые функции вручную и использовать ng-annotate для выполнения это для вас.

person JB Nizet    schedule 17.04.2016
comment
Это работает, но консоль выдает эту ошибку: $state.go не является функцией. Почему? (Я также добавил две зависимости от вашего кода: .run(['$rootScope', '$window', function($rootScope, $window) { toState, toParams, fromState, Auth, $state)) - person panagulis72; 17.04.2016
comment
Ты снова делаешь ту же ошибку. Метод, переданный $on, НЕ является внедряемой функцией. Передача Auth и $state этой функции вообще не имеет смысла. Эти службы должны быть внедрены в функцию, переданную в run() (и поэтому их имя также должно быть добавлено в массив) - person JB Nizet; 17.04.2016
comment
Сделанный! Но у меня странная локальная ошибка... когда дело доходит до else { $state.go('login'); } он возвращается к if (Auth.isLoggedIn && $window.localStorage.identityToken), затем переходит к $state.go('login') и возвращается к if (Auth....) и продолжается до тех пор, пока не произойдет сбой браузера... Если хотите, я вставил весь код сюда: stackoverflow.com/questions/36677234/ - person panagulis72; 17.04.2016
comment
Что ж, это вполне ожидаемо: вы хотите, чтобы этот код выполнялся каждый раз, когда маршрутизатор переходит в состояние. И в конце вы указываете маршрутизатору перейти в состояние входа в систему. Вы не должны выполнять блок else, если запрошенное состояние — «вход в систему». - person JB Nizet; 17.04.2016
comment
У меня та же проблема внутри блока «если»... $state.go('app.dashboard'), $state.go(fromState.name) и т.д.... Я просто хочу сделать код, который проверяет, у пользователя есть разрешения... тогда, если они у него есть, пусть продолжает его.. - person panagulis72; 17.04.2016
comment
Если вы хотите, чтобы пользователь продолжал, не делайте $state.go(...). Просто ничего не делай. - person JB Nizet; 17.04.2016
comment
Да я думал об этом, но у меня бывает и обратный случай: 'если у пользователя нет разрешения, остается', то: $state.go(fromState.name). Как сказать «оставаться» в текущем положении? - person panagulis72; 17.04.2016