2017-09-26 83 views
0

鉴于以下情况,$injector.get将失败,因为$rootScope不可用。如何知道何时可以提供角度依赖关系

app.factory('$exceptionHandler', ['$injector', $injector => { 
    const $rootScope = $injector.get('$rootScope') 

    return (exception, cause) => { 
    // code 
    } 
}) 

在研究中,我一直遇到这个问题,它在运行时解析(当调用内部函数时)。

app.factory('$exceptionHandler', ['$injector', $injector => { 
    return (exception, cause) => { 
    const $rootScope = $injector.get('$rootScope') 
    // code 
    } 
}) 

我想什么是不知何故知道我什么时候能够解决的依赖。例如:

app.factory('$exceptionHandler', ['$injector', $injector => { 
    $injector.illLetYouKnowWhenWeCanDoStuff().then(() => { 
    const $rootScope = $injector.get('$rootScope') 
    }) 

    return (exception, cause) => { 
    // code 
    } 
}) 

这可能吗?

相关=> $location from $exceptionHandler - dependency conflict

+0

为什么注射注射器,而不是只注射$ rootScope?注入器会找出依赖关系,从而创建$ rootScope并在创建exceptionHandler之前注入它。另外请注意,'$'前缀恰好可以区分角度服务和您自己的服务。所以你不应该用'$'来加前缀。 –

+0

@JBNizet阅读我在底部链接的问答,以及您指的是我的服务?本地$ rootScope? – aw04

+0

@JBNizet $注射器是第二个例子需要的工作(以及我目前的解决方法),但它可能在第一个例子中是不相关的(同样的错误,无论哪种方式) – aw04

回答

1

所有通过正常的角度函数(工厂,服务,控制器,等等)登记注射剂可立刻在自举。 $rootScope未正常注册。它在应用程序引导后提供。由于$exceptionHandler立即实例化,因此$rootScope尚未提供。

解决循环依赖错误的最佳方法是打破圆。让您的$exceptionHandler取决于您构建的自定义服务。在注入$rootScope.run()块中配置该新服务。

app.factory('$exceptionHandler', ['myExceptionHandlingConfig', function(myExceptionHandlingConfig) { 

    return function(exception, cause) { 
    //do exceptional stuff 
    } 

}]); 

app.factory('myExceptionHandlingConfig', function() { 

    return {}; 

}); 

app.run(['$rootScope', 'myExceptionHandlingConfig', function($rootScope, myExceptionHandlingConfig){ 

    myExceptionHandlingConfig.someProperty = $rootScope.something; 

}]); 

注:$rootScope会在系统启动时间很空的,所以你可能需要设置一个$watch更新时的任何数据,你正在寻找的服务。

相关问题