Не удалось создать экземпляр модуля ng из-за того, что функция ($ provide) не использует явную аннотацию

#javascript #angularjs

#javascript #angularjs

Вопрос:

Итак, вот ошибка:

 Uncaught Error: [$injector:modulerr] Failed to instantiate module ng due to:
Error: [$injector:strictdi] function($provide) is not using explicit annotation and cannot be invoked in strict mode
http://errors.angularjs.org/1.5.8/$injector/strictdi?p0=function($provide)
    at localhost/build/js/app-vendor.js:53360:12
    at Function.annotate [as $$annotate] (localhost/build/js/app-vendor.js:57244:17)
    at injectionArgs (localhost/build/js/app-vendor.js:57971:36)
    at Object.invoke (localhost/build/js/app-vendor.js:58002:18)
    at runInvokeQueue (localhost/build/js/app-vendor.js:57903:35)
    at localhost/build/js/app-vendor.js:57912:11
    at forEach (localhost/build/js/app-vendor.js:53613:20)
    at loadModules (localhost/build/js/app-vendor.js:57893:5)
    at createInjector (localhost/build/js/app-vendor.js:57815:19)
    at doBootstrap (localhost/build/js/app-vendor.js:55050:20)
http://errors.angularjs.org/1.5.8/$injector/modulerr?p0=ngamp;p1=Error: %5….com:21293/WebGui/build/js/app-vendor.js:55050:20)
  

Обычно вы знаете, что делать: выполните поиск функции без аннотаций. Но:

  • Я сделал это и не могу найти ошибку
  • Я запускаю свой код через ngAnnotate
  • Трассировка стека ничего не говорит, только угловой код
  • искал вхождения function($provide) — тщетно

Я перехватил выданное исключение, и где-то в трассировке стека есть:

 var injector = createInjector(modules, config.strictDi);
injector.invoke(['$rootScope', '$rootElement', '$compile', '$injector',
    function bootstrapApply(scope, element, compile, injector) {
        scope.$apply(function() {
            element.data('$injector', injector);
            compile(element)(scope);
        });
    }]
);
return injector;
  

и

 if (!($inject = fn.$inject)) {
    $inject = [];
    if (fn.length) {
        if (strictDi) {
            if (!isString(name) || !name) {
                name = fn.name || anonFn(fn);
            }
            throw $injectorMinErr('strictdi',
                '{0} is not using explicit annotation and cannot be invoked in strict mode', name);
        }
        argDecl = extractArgs(fn);
        forEach(argDecl[1].split(FN_ARG_SPLIT), function(arg) {
            arg.replace(FN_ARG, function(all, underscore, name) {
                $inject.push(name);
            });
        });
    }
    fn.$inject = $inject;
}
  

Из того, что я видел в окне просмотра и трассировке стека, это происходит где-то в приложении, где $injector.invoke вызывается функция в качестве аргумента. Но я честно искал файлы и не могу найти ни одного из этих вызовов.

Это происходит для Angular 1.5.8.

Комментарии:

1. Иногда ng-annotate нуждается в небольшой помощи путем добавления явного /*@ngInject*/ . Это может иметь место, например, в распознавателях пользовательского интерфейса-маршрутизатора.

2. Я знаю, но все же я проанализировал код и не нашел ни одного такого места если бы это был мой обычный код, то сообщение об исключении содержало бы больше деталей и точно указывало бы на мою ошибку

Ответ №1:

У меня также была эта проблема, и я обнаружил, что она была решена путем отключения отладчика Chrome angularjs «Batarang».