Error: $injector:strictdi Explicit annotation required but it is implemented - linked to angular-ui-router?
Error: $injector:strictdi Explicit annotation required but it is implemented - linked to angular-ui-router?
我收到一条对我来说毫无意义的错误消息,因为我正在做它说我没有做的事情。
http://errors.angularjs.org/1.6.5/$injector/strictdi?p0=function(labelsResource)
它抱怨的代码正是下面的代码(但我删除了函数 labelsResource 中的实际逻辑):
(function (module, angular) {
"use strict";
var labelsResource = function ($resource, $timeout, salesFlowsContext, applicationConfiguration) { ... };
labelsResource.$inject = ["$resource", "$timeout", "salesFlowsContext", "applicationConfiguration"];
module.factory("labelsResource", labelsResource);
}(
angular.module("common.translation"),
angular
));
我什至试图通过删除 "use strict" 使其工作,但错误仍然存在。我忽略了什么?
类似的问题没有答案或对我有用。
编辑:同时我了解到它似乎与我升级angular-ui-router有关。
我目前使用的是 0.2.14 版,但是当我转到 1.0.10 版时出现错误。
如果我不移动到更新版本的路由器,一切都会加载,但我会收到许多链接到 angular-ui-router:
的错误
Error: transition superseded
Error: transition prevented
Error: transition failed
我应该使用哪个版本的 Angular-ui-router 才能使 angular 1.6.5 成功运行?
编辑 2:
可能与新的ui路由器有关。问题出现在这里:
$stateProvider
.state({
name: "root",
"abstract": true,
template: "<ui-view/>",
resolve: {
labelsResource: "labelsResource",
codingSchemesResource: "codingSchemesResource",
translation: function (labelsResource) {
return labelsResource.getLabels();
},
codingSchemesTranslation: function (codingSchemesResource) {
return codingSchemesResource.getCodingSchemes();
}
},
controller: "RootController",
controllerAs: "root"
})
当它到达 labelsResource 并且 ui-router 尝试执行以下操作时:
// This effectively calls $get() on `$uiRouterProvider` to trigger init (when ng enters runtime)
runBlock.$inject = ['$injector', '$q', '$uiRouter'];
function runBlock($injector, $q, $uiRouter) {
services.$injector = $injector;
services.$q = $q;
// The $injector is now available.
// Find any resolvables that had dependency annotation deferred
$uiRouter.stateRegistry.get()
.map(function (x) { return x.$$state().resolvables; })
.reduce(unnestR, [])
.filter(function (x) { return x.deps === "deferred"; })
.forEach(function (resolvable) { return resolvable.deps = $injector.annotate(resolvable.resolveFn, $injector.strictDi); });
}
$injector.annote 代码失败:
function annotate(fn, strictDi, name) {
var $inject, argDecl, last;
if (typeof fn === 'function') {
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;
}
} else if (isArray(fn)) {
last = fn.length - 1;
assertArgFn(fn[last], 'fn');
$inject = fn.slice(0, last);
} else {
assertArgFn(fn, 'fn', true);
}
return $inject;
}
我不知道为什么。这适用于 angularjs 1.5.8 和 ui-router 0.2.14.
我通过类似的问题找到了解决我的问题的方法:
angular-ui-router not resolving injected parameters
这不是同一个问题,但在看到上述问题的答案后,简单的解决方案终于打动了我。不敢相信花了半天时间才传给我...
我只需要像为任何其他功能一样注入,例如制作新模块时的功能。
所以下面这段代码的解决方案:
resolve: {
labelsResource: "labelsResource",
codingSchemesResource: "codingSchemesResource",
translation: function (labelsResource) {
return labelsResource.getLabels();
},
codingSchemesTranslation: function (codingSchemesResource) {
return codingSchemesResource.getCodingSchemes();
}
}
下面是
resolve: {
labelsResource: "labelsResource",
codingSchemesResource: "codingSchemesResource",
translation: ["labelsResource", function (labelsResource) {
return labelsResource.getLabels();
}],
codingSchemesTranslation: ["codingSchemesResource", function (codingSchemesResource) {
return codingSchemesResource.getCodingSchemes();
}]
}
我收到一条对我来说毫无意义的错误消息,因为我正在做它说我没有做的事情。
http://errors.angularjs.org/1.6.5/$injector/strictdi?p0=function(labelsResource)
它抱怨的代码正是下面的代码(但我删除了函数 labelsResource 中的实际逻辑):
(function (module, angular) {
"use strict";
var labelsResource = function ($resource, $timeout, salesFlowsContext, applicationConfiguration) { ... };
labelsResource.$inject = ["$resource", "$timeout", "salesFlowsContext", "applicationConfiguration"];
module.factory("labelsResource", labelsResource);
}(
angular.module("common.translation"),
angular
));
我什至试图通过删除 "use strict" 使其工作,但错误仍然存在。我忽略了什么?
类似的问题没有答案或对我有用。
编辑:同时我了解到它似乎与我升级angular-ui-router有关。 我目前使用的是 0.2.14 版,但是当我转到 1.0.10 版时出现错误。 如果我不移动到更新版本的路由器,一切都会加载,但我会收到许多链接到 angular-ui-router:
的错误Error: transition superseded
Error: transition prevented
Error: transition failed
我应该使用哪个版本的 Angular-ui-router 才能使 angular 1.6.5 成功运行?
编辑 2:
可能与新的ui路由器有关。问题出现在这里:
$stateProvider
.state({
name: "root",
"abstract": true,
template: "<ui-view/>",
resolve: {
labelsResource: "labelsResource",
codingSchemesResource: "codingSchemesResource",
translation: function (labelsResource) {
return labelsResource.getLabels();
},
codingSchemesTranslation: function (codingSchemesResource) {
return codingSchemesResource.getCodingSchemes();
}
},
controller: "RootController",
controllerAs: "root"
})
当它到达 labelsResource 并且 ui-router 尝试执行以下操作时:
// This effectively calls $get() on `$uiRouterProvider` to trigger init (when ng enters runtime)
runBlock.$inject = ['$injector', '$q', '$uiRouter'];
function runBlock($injector, $q, $uiRouter) {
services.$injector = $injector;
services.$q = $q;
// The $injector is now available.
// Find any resolvables that had dependency annotation deferred
$uiRouter.stateRegistry.get()
.map(function (x) { return x.$$state().resolvables; })
.reduce(unnestR, [])
.filter(function (x) { return x.deps === "deferred"; })
.forEach(function (resolvable) { return resolvable.deps = $injector.annotate(resolvable.resolveFn, $injector.strictDi); });
}
$injector.annote 代码失败:
function annotate(fn, strictDi, name) {
var $inject, argDecl, last;
if (typeof fn === 'function') {
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;
}
} else if (isArray(fn)) {
last = fn.length - 1;
assertArgFn(fn[last], 'fn');
$inject = fn.slice(0, last);
} else {
assertArgFn(fn, 'fn', true);
}
return $inject;
}
我不知道为什么。这适用于 angularjs 1.5.8 和 ui-router 0.2.14.
我通过类似的问题找到了解决我的问题的方法: angular-ui-router not resolving injected parameters
这不是同一个问题,但在看到上述问题的答案后,简单的解决方案终于打动了我。不敢相信花了半天时间才传给我...
我只需要像为任何其他功能一样注入,例如制作新模块时的功能。
所以下面这段代码的解决方案:
resolve: {
labelsResource: "labelsResource",
codingSchemesResource: "codingSchemesResource",
translation: function (labelsResource) {
return labelsResource.getLabels();
},
codingSchemesTranslation: function (codingSchemesResource) {
return codingSchemesResource.getCodingSchemes();
}
}
下面是
resolve: {
labelsResource: "labelsResource",
codingSchemesResource: "codingSchemesResource",
translation: ["labelsResource", function (labelsResource) {
return labelsResource.getLabels();
}],
codingSchemesTranslation: ["codingSchemesResource", function (codingSchemesResource) {
return codingSchemesResource.getCodingSchemes();
}]
}