【问题标题】:Configuring shared services across multiple modules in AngularJS在 AngularJS 中跨多个模块配置共享服务
【发布时间】:2015-09-01 15:55:22
【问题描述】:

我的应用正在关注 John Papa 的 styleguide 用于 AngularJS 应用:

样式指南强调使用高度模块化的方法来设计应用程序。我的问题是关于多种配置及其对共享服务的影响。

假设我有一个这样的主模块:

angular.module("app", ["app.feature1"])
  .config(function() {
    // do some configuration here
    console.log("app configured");
  });

还有一个配置共享 Angular 服务的功能模块,比如说 $http 服务:

angular.module("app.feature1", [])
  .config(function($http) {
  // configure the $http service
  console.log("feature1 configured");
}); 

我的理解是否正确,“feature1”的配置将延续到主模块,因为 $http 服务是单例的,因此跨模块共享?还是我必须在主模块中配置 $http 服务,因为每个模块都有自己的 $http 服务实例?

编辑:我可以确认依赖配置被继承并首先执行。请参阅 David 的 jsfiddle 示例。

【问题讨论】:

    标签: angularjs config


    【解决方案1】:

    作为最佳实践,您应该尽早配置服务,这通常是您的主模块(应用根目录),并且最好只配置一次以避免重复更改。

    由于$http 是一个单例(如您所述),因此每次注入$http 时,通过配置进行的任何更改都将传播到整个应用程序。

    还值得一提的是,对服务的配置是先进先出的,这意味着如果您有两个配置更改,最后访问的配置将是持久化到服务的配置,因为如果它们之前的配置将被覆盖正在更改服务的相同组件。

    在您的情况下,是的,您的模块中对$http 的更改将扩展到您的主应用程序和使用$http 的任何其他模块。

    最后,根据 cmets,子依赖配置在父配置之前解析,正如这个简单的小提琴所示:

    http://jsfiddle.net/maqzo6fv/

    HTML:

    <div ng-app="app"></div>
    

    JS:

    angular.module("app", ["app.feature1"])
        .config(function() {
            alert('main config');
    });
    
    angular.module("app.feature1", [])
        .config(function() {
            alert('child config');
    }); 
    

    每次加载时,子配置都会在 main 之前调用 alert。

    【讨论】:

    • 我说的对吗,因为“app.feature1”是根模块的依赖,“app.feature1”会在配置主模块之前被实例化,因此feature1的配置块将首先执行?
    • 如果您查看一个典型的 Angular 应用程序并故意“破坏”加载的依赖项中的某些内容,会发生什么?您会发现主模块中的后续代码没有加载。我在这里猜测,但我相信 Angular 首先加载子模块,然后加载注入它们的父模块。但是,我不能确定孩子的.config() 在父母之前被调用。可能是它只构建了依赖关系图。
    • 我可以确认依赖配置首先被执行。谢谢!
    • @maxmantz 我刚刚确认了这一点,并在我的答案中添加了一个小提琴示例:)。乐于助人!
    猜你喜欢
    • 2022-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-26
    • 1970-01-01
    • 2019-11-19
    • 1970-01-01
    相关资源
    最近更新 更多