【问题标题】:How to inject a module and make it accesible to all modules and submodules of app (getting unknown provider error)如何注入模块并使其可供应用程序的所有模块和子模块访问(出现未知提供程序错误)
【发布时间】:2015-05-15 15:15:33
【问题描述】:

请注意,这不是重复的:How to inject module and make it accesible to entrie angular app

我有一个模块(app.config),我想将它注入到我的整个应用程序中。

该模块需要在注入myApp的所有其他模块和子模块(模块内的模块)中可访问

例如,我的应用如下所示:

angular.module('myApp', [
    'app.config',
    'module#1',
    'module#2',
    'module#3',
    'module#4'    
])
.config...

//////////////////////////////

这里是app.config

angular.module('app.config', []).
    constant('NAME1', 'Name1').
    constant('NAME2', 'Name2'); 
////////////////////

我希望 'app.config' 以这样的方式注入,它应该可以在 module#500 中访问,这不是 'myApp' 的直接依赖,而是 module#1 的依赖 - 这反过来又是myApp.

module#1是这样定义的(如图,module#500module#1的依赖):

 angular.module('module#1', [
        'module#500',
        'module#501',
        'module#502',
        ...    
    ]);

这是我的问题:

angular.module('module#500', []).
    service('serviceOne', serviceOne);

function ServiceOne($http, NAME1) {

    var service = {
        getMyProfile: function(){return $http.get('api/' + NAME1);}
    };

    return service;
}

问题 - 我收到错误 -> Uncaught Error: [$injector:unpr] Unknown provider: NAME1Provider <-NAME1 <- serviceOne 但我以为我将它注入到整个应用程序中???

我不想将module#500 直接添加为'myApp' 的依赖项 我不想将module#500 作为module#1 的依赖项。我想离开 module#1 作为 myApp 的依赖项

我也不想将app.config 单独注入每个模块。还有其他解决方案吗?

【问题讨论】:

  • 您可能无法解决依赖关系错误。 Not NAME 未定义...
  • 对不起@Vishwanath - 我不确定我明白你在说什么。 “Not Name is undefined”?
  • 您是否收到错误“名称未定义”?
  • 确切的错误是:Uncaught Error: [$injector:unpr] Unknown provider: NAME1Provider <-NAME1 <- serviceOne

标签: angularjs dependency-injection


【解决方案1】:

我不想单独注入 app.config 到每个 模块。还有其他解决方案吗?

我不知道您期待什么解决方案?有了这行:angular.module('module#500', []). module#500 是如何知道其他任何事情的,它什么也没有。也许我在这里误解了一些东西。

编辑,因为我刚刚阅读了您昨天的帖子和 cmets:我认为您没有正确理解依赖注入。它只有一种方式,模块#1 可以访问模块#500,但模块#500 无权访问模块#1。它必须是这样的:如果模块#500 的某些行为依赖于模块#1,你怎么能对它进行单元测试呢?

你的项目实际上并不需要这么多模块,如果它们都依赖于相同的配置变量的话。那些依赖于配置变量的工厂和服务应该和它在同一个模块中。这是适当的划分,从长远来看会让你的生活更轻松。

【讨论】:

    【解决方案2】:

    如果您不想让myApp 依赖于app.config(尽管这样做是正确的,因为它的子模块依赖 依赖于它) ,您可以通过手动引导加载配置模块

    angular.bootstrap(document, ['myApp', 'app.config']);
    

    而不是ng-app="myApp"

    【讨论】:

    • 我们实际上是在使用 deferredBootstrap 并且“几乎相同”的概念对我们有用。所以无论如何我都会给你一张支票。谢谢。
    【解决方案3】:

    您忘记在您的ServiceOne 服务中注入NAME1

    例如:function ServiceOne($http, NAME1)

    【讨论】:

    • 抱歉,我现在将 NAME1 添加到 serviceOne。那不是问题。这只是一个错字。非常感谢您指出!如果可能,请删除此答案以免混淆。如果您愿意,可以将其添加为评论。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-03
    • 1970-01-01
    • 2019-06-25
    • 1970-01-01
    • 2016-01-06
    相关资源
    最近更新 更多