在AngularJS服务($)可用之前,不要执行.run()

时间:2014-01-15 11:10:28

标签: javascript angularjs dependency-injection

继上一个问题之后:Adding a Self-Executing Anonymous Function to extend Sir Trevor in AngularJS whilst accessing $

我运行一些配置代码来扩展Sir Trevor内容编辑器,然后减少或删除我将$ translate服务注入代码的依赖项。

   angular.module('myApp', [])
        .run(['$translate', function($translate) {

            // $translate is injected by Angular.

            if (SirTrevor) {
                SirTrevor.Blocks.NewBlock = SirTrevor.Block.extend({
                    // Whatever here... then
                    title: function() {
                        return $translate('some.path.somewhere');
                    }
                });

                SirTrevor.Blocks.AnotherNewBlock = SirTrevor.Block.extend({
                    // Whatever here... then
                    title: function() {
                        return $translate('some.other.path.somewhere');
                    }
                });
            }
        }]);

一切都在我的本地机器上运行良好,但是当部署到我的构建服务器时,构建中断了!罪魁祸首是我的代码执行时$translate没有准备好或可用?我想知道在$watch服务可用时是否可以添加某种$translate或函数来执行代码?

非常感谢任何建议。

1 个答案:

答案 0 :(得分:0)

DI将在注入和执行代码之前解析所有依赖项。对于服务,这意味着单例将在注入之前(懒惰地)实例化一次。

如果您的服务需要在有用之前做一些异步事情,您可能需要返回一个承诺并使用.then()来确保一切都完全解决。我不确定你使用的是哪个$translate,但像http://pascalprecht.github.io/angular-translate/这样的人会返回一个承诺,并在加载内容时广播事件。