【问题标题】:How to know when a dependency is available in angular如何知道依赖项何时以角度可用
【发布时间】:2017-09-26 23:53:42
【问题描述】:

鉴于以下情况,$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

【问题讨论】:

  • 为什么要注入注入器,而不是一开始就注入 $rootScope?注入器会找出依赖关系,从而创建 $rootScope 并在创建 exceptionHandler 之前注入它。另外,请注意$ 前缀正是用于区分角度服务和您自己的服务。所以你不应该在你的服务前面加上$
  • @JBNizet 阅读了我在底部链接的问答,您指的是我的什么服务?本地 $rootScope?
  • @JBNizet $injector 是第二个示例工作所必需的(以及我当前的解决方法),但在第一个示例中可能无关紧要(无论哪种方式都存在相同的错误)
  • 通常情况下,一旦应用程序启动,所有可注射的东西都可用。新服务通常不会在运行时添加。也许如果你在更高层次上解释你想要达到的目标,有人可以提供帮助。
  • @JCFord 当然。我只需要在这个工厂内从 $rootScope 获取一些东西。问题是它最初没有准备好,但我可以在一段时间后得到它(即内部函数)

标签: angularjs


【解决方案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 以在您要查找的任何数据可用时更新服务。

【讨论】:

    猜你喜欢
    • 2021-07-27
    • 1970-01-01
    • 1970-01-01
    • 2013-02-23
    • 2012-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多