2017-10-19 127 views
0

我得到一个,对我来说,无意义的错误信息,因为我正在做我说的没做的事情。

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。

+0

做其他依赖像'salesFlowsContext'&'applicationConfiguration'遵循strictdi? –

+0

是的,还想补充一点,我正在从版本1.5.8移到1.6.5,而我在1.5.8中没有这个问题。 –

回答

0

我发现我的问题的解决方案,通过一个类似的问题问: 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(); 
    }] 
} 
+0

'labelsResource:“labelsResource”'和'codingSchemesResource:“codingSchemesResources”'在任何情况下似乎都没有必要。你为什么拥有它们? –

+0

我认为他们有必要在他们下面的翻译中使用它们。所以我想我不需要他们? –

+0

删除它们,它应该仍然工作。 –