2017-09-26 95 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更新時的任何數據,你正在尋找的服務。

相關問題