何时重新初始化AngularJS服务?

时间:2015-08-05 18:53:13

标签: angularjs angularjs-service angularjs-controller

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

2 个答案:

答案 0 :(得分:10)

当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,因此它会点击“if not”条件并且:

  1. 致电new User()
  2. 下次将其存储在$injector.cached
  3. 归还。
  4. 现在让我们说我们需要第二次注入User

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

    再次,当Angular看到SecondCtrlConstructor取决于User时,它会调用$injector.get('User')来获取User,以便它可以注入它。这一次,它达到“如果是这样”的条件。由于我们之前已将User放入$injector.cached,因此我们在那里找到了它。因此,User不会再次实例化。

    假设我们的ThirdCtrl也取决于User。它也会在$injector.cached中找到它,因此它不会实例化UserConstructor。假设我们myDirective取决于User。同样的事情会发生 - 它会在$injector.cached中找到它,因此不会实例化它。

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

    有关详情,请参阅https://medium.com/@adamzerner/dependency-injection-in-angular-18490a9a934

答案 1 :(得分:5)

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

  

Angular服务是:

     
      
  • Lazily实例化 - Angular仅在实例化时实例化服务   应用程序组件取决于它。
  •   
  • 单身人士 - 依赖于服务的每个组件都会获得对单个实例的引用   由服务工厂生成。
  •