尽管服务存在,但未注入依赖关系

时间:2015-03-02 17:52:10

标签: jquery angularjs node.js coffeescript yeoman

所以我已经在Angular.js项目上工作了一段时间,现在将在比赛中使用,中途我意识到我需要一个插件系统来在运行时动态加载一些必要的代码。到目前为止,我发现angular.js不适合在运行时加载服务。由于代码仅在竞争时可供竞争对手使用,因此我只能提供一些不起作用的示例。

// ex1.coffee

mainModule = angular.module('mainModule')

mainModule.service('needed', () ->
    @neededFunc() ->
        console.log "just an example"
    return this    

mainModule.service('ex1', ($injector) ->
    @loadFile = (u, pluginName) ->
        $.ajax
            dataType: "script",
            url: u,
            data: null,
            success: (jqxhr, textStatus) =>
                $injector.invoke([pluginName, (plugin) =>
                    plugin.testFunc()
            error: (jqxhr, textStatus, errorThrown) ->
                console.log "couldn't find the script"
    return this


// ex2.coffee

mainModule = angular.module('mainModule')

mainModule.service('ex2', (needed) ->
    @testFunc = () ->
        needed.neededFunc()
        console.log "in this dynamically loaded file"
    return this  

隐含的东西:有一个名为mainModule的现有模块。 Jquery和角度先前已包含在dom中。 ex1.js已包含在dom中,而ex2.js尚未包含在dom中。你是文件ex2.js和pluginName =“ex2”的网址。调用成功处理程序时,调用函数失败,表示ex2Provider不存在。但是,如果我在成功回调中断点并检查mainModule._invokeQueue,则确实存在一个服务名称为“ex2”的数组,因此它肯定在模块中有一个现有的配方,但$ injector.invoke调用仍然失败。如果我修改成功处理程序来调用$ injector.has pluginName,它就会失败。有人能告诉我模块如何知道这个动态加载的服务的提供者,但是不能将它注入到使用$ injector的函数调用中? 该项目是一个用咕噜声建造的自耕农项目。

仍然学习角度所以如果有一些概念我缺失或说错了,请告诉我。

1 个答案:

答案 0 :(得分:1)

AngularJS将在加载模块时引导它。在引导期间,所有依赖项都由注入器初始化。

angular.module('mainModule').service('ex2', .....);

当您通过AJAX执行上述操作时, mainModule已经被引导后发生service()会将提供程序排队以进行引导,但引导不再发生。

这是关于bootstrapping angular的手册。

  

在加载或定义模块后,应调用angular.bootstrap()。在应用程序引导后,您无法添加控制器,服务,指令等。

我认为您可以做的是创建一个新模块,并将其附加到现有模块。

所以你的AJAX代码可能看起来像这样。

angular.module('ex2Module',[]).service('ex2', .....);
angular.module('mainModule').requires.push('ex2Module');
$rootScope.$digest();

我无法对此进行测试,但我认为这会导致新模块ex2Module被引导并作为依赖项添加到现有mainModule。进样器应该看到此模块排队等待引导并安装它。

希望这有帮助。