错误:$ injector:strictdi需要明确的注释,但它被实现 - 链接到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
));
我甚至要通过删除“使用它的工作严格“,但错误依然存在。我忽略了什么?
类似问题没有答案或我为之工作。
编辑:同时我得知它似乎与我的angular-ui-router升级有关。 我目前使用的版本是0.2.14,但是当我移动到版本1.0.10时出现错误。 如果我不动路由器,一切加载的新版本,而是我得到挂角UI路由器许多错误:
Error: transition superseded
Error: transition prevented
Error: transition failed
哪个角度-UI-路由器的版本我应该使用这样我可以成功地让角度1.6.5工作?
编辑2:
它可能涉及到新的用户界面路由器。问题就出现在这里:
$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路由器试图做到以下几点:
// 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();
}]
}
'labelsResource:“labelsResource”'和'codingSchemesResource:“codingSchemesResources”'在任何情况下似乎都没有必要。你为什么拥有它们? –
我认为他们有必要在他们下面的翻译中使用它们。所以我想我不需要他们? –
删除它们,它应该仍然工作。 –
做其他依赖像'salesFlowsContext'&'applicationConfiguration'遵循strictdi? –
是的,还想补充一点,我正在从版本1.5.8移到1.6.5,而我在1.5.8中没有这个问题。 –