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