何时重新初始化AngularJS服务?

vja*_*n27 6 angularjs angularjs-service angularjs-controller

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

Ada*_*ner 10

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

angular
  .module('myApp')
  .service('User', function UserConstructor() {
    // stuff
  });
Run Code Online (Sandbox Code Playgroud)

当您尝试运行控制器或某些依赖于某项服务的东西时,Angular会为您注入它.

app.controller('FirstCtrl', function FirstCtrlConstructor(User) {
  // User is available here
});
Run Code Online (Sandbox Code Playgroud)

在引擎盖下,角度使用这个叫做$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
};
Run Code Online (Sandbox Code Playgroud)

所以,当看到角,它需要注入UserFirstCtrlConstructor,它要求$injector.get('User')得到User.由于它User之前没有注入任何其他地方,它将达到"如果不是"的条件,并且:

  1. 打电话new User().
  2. 将其存放$injector.cached下次.
  3. 把它返还.

现在让我们说我们需要User第二次注入:

app.controller('SecondCtrl', function SecondCtrlConstructor(User) {
  // stuff
});
Run Code Online (Sandbox Code Playgroud)

再一次,当Angular认为SecondCtrlConstructor依赖于User它时,它会调用$injector.get('User')以获得User它可以注入它.这一次,它达到"如果是这样"的条件.自从我们之前投入使用以来,我们就User$injector.cached那里找到了它.因此,User不会再次实例化.

说我们有一个ThirdCtrl也取决于User.它也会找到它$injector.cached,因此它不会实例化UserConstructor.说我们有myDirective这取决于User.同样的事情会发生 - 它会找到它$injector.cached,因此不会实例化它.

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

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


mof*_*jed 5

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

Angular服务包括:

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