如何检测Angular应用程序是否已从Angular外部初始化?

时间:2014-07-01 00:38:00

标签: javascript angularjs angularjs-scope

在开发lift-ng插件时,我注意到an issue,有时服务器会在角度初始化之前通过comet将事件发送到客户端。这会导致应用程序无意中错过事件。我想知道是否有办法检测应用程序是否已初始化,即所有控制器,服务,指令等已经实例化,因此所有监听器都已为事件做好准备。因为这是一个插件,我需要能够做到这一点而不需要角度组件来实现任何代码。我可以向应用程序添加控制器,服务或其他内容,但解决方案不能要求每个组件都发送事件,例如。

1 个答案:

答案 0 :(得分:4)

尝试这样的事情:

try {
    angular.bootstrap(document)
} 
catch(e) {
    console.log(!!e.message.indexOf('btstrpd')) 
    //will log true if the error is of the type `btstrpd`, 
    //you can do whatever you want with it here.
}

如果已经有应用程序引导,angular.bootstrap将发出错误。 btstrpd是错误的名称,表示应用已经被引导过。

这很简单,我希望它能适用于您的情况,但如果它不能解决我问题,我会想到更复杂的事情。


另一种方法:

如果您有关于模块的一些信息,可以使用以下方法检查组件是否已经过引导:

angular.element(document.querySelector('[ng-app]')).injector().has('$http')

这会找到使用ng-app属性的位置,然后调用已初始化的injector实例,您可以从中调用has以查看已初始化的提供程序。


另一种方法:

您可以在没有第二个参数的情况下尝试angular.bootstrap而不是angular.module,如果模块已加载或发出错误,则应检索模块。

try {
    angular.module('moduleName')
} 
catch(e) {
    console.log(!!e.message.indexOf('nomod')) 
    //will log true if the error is of the type `nomod`, 
    //you can do whatever you want with it here.
}