【问题标题】:When is an AngularJS service re-initialized?AngularJS 服务何时重新初始化?
【发布时间】:2015-10-28 16:56:26
【问题描述】:

angularjs 中服务(或工厂)的生命周期是什么,何时重新初始化?

【问题讨论】:

    标签: angularjs angularjs-service angularjs-controller


    【解决方案1】:

    服务/工厂仅在第一次使用时初始化一次。来自文档:https://docs.angularjs.org/guide/services

    Angular 服务是:

    • 延迟实例化 - Angular 仅在 应用程序组件依赖于它。
    • Singleton – 依赖于服务的每个组件都获得对单个实例的引用 由服务工厂生成。

    【讨论】:

      【解决方案2】:

      当 Angular 引导时,它会将服务的构造函数附加到关联的模块。这种情况发生一次。

      angular
        .module('myApp')
        .service('User', function UserConstructor() {
          // stuff
        });
      

      当你尝试运行控制器或依赖于某个服务的东西时,Angular 会为你注入它。

      app.controller('FirstCtrl', function FirstCtrlConstructor(User) {
        // User is available here
      });
      

      在底层,Angular 使用这个叫做$injector 的东西为你做依赖注入。它的工作原理是这样的:

      var $injector = {};
      $injector.cached = [];
      $injector.get = function(service) {
        // check if service is in this.cached
          // if so, return it
          // if not
            // 1) instantiate the service
            // 2) store it in this.cached
            // 3) return it
      };
      

      所以当 Angular 发现它需要将User 注入到FirstCtrlConstructor 中时,它会调用$injector.get('User') 来获取User。由于它之前没有在其他任何地方注入 User,它会达到“如果不是”条件并且:

      1. 致电new User()
      2. 保存在$injector.cached,以备下次使用。
      3. 退货。

      现在假设我们需要第二次注入User

      app.controller('SecondCtrl', function SecondCtrlConstructor(User) {
        // stuff
      });
      

      同样,当 Angular 发现 SecondCtrlConstructor 依赖于 User 时,它会调用 $injector.get('User') 来获取 User 以便注入它。这一次,它达到了“如果是这样”的条件。由于我们之前将User 放在$injector.cached 中,所以它为我们找到了它。因此,User 不会再次被实例化。

      假设我们有一个ThirdCtrl,它也依赖于User。它也会在$injector.cached 中找到它,因此它不会实例化UserConstructor。假设我们有依赖于UsermyDirective。同样的事情也会发生 - 它会在 $injector.cached 中找到它,因此不会实例化它。

      这称为Singleton pattern。当您不想多次实例化某些东西时使用它。 Angular 将其用于服务,因此它们不会被多次实例化。工厂也是如此(对于提供者来说可能也是如此;对于值和常量可能不是这样)。

      有关更多信息,请参阅https://medium.com/@adamzerner/dependency-injection-in-angular-18490a9a934

      【讨论】:

      • 谢谢!很棒的解释。
      • 没问题,很高兴为您提供帮助:)
      猜你喜欢
      • 1970-01-01
      • 2013-11-07
      • 2013-08-13
      • 1970-01-01
      • 1970-01-01
      • 2013-04-23
      • 2015-12-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多