angularjs - AngularJS 服务何时重新初始化?

标签 angularjs angularjs-service angularjs-controller

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

最佳答案

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

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

当你尝试运行 Controller 或依赖于某个服务的东西时,Angular 会为你注入(inject)它。
app.controller('FirstCtrl', function FirstCtrlConstructor(User) {
  // User is available here
});

在引擎盖下,Angular 使用了这个叫做 $injector 的东西。为你做依赖注入(inject)。它的工作原理是这样的:
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 看到需要注入(inject) User进入 FirstCtrlConstructor ,它调用 $injector.get('User')获取 User .由于没有注入(inject)User之前的任何其他地方,它都会达到“如果不是”条件,并且:
  • 调用 new User() .
  • 将其存储在 $injector.cached下次。
  • 把它返还。

  • 现在假设我们需要注入(inject) User第二次:
    app.controller('SecondCtrl', function SecondCtrlConstructor(User) {
      // stuff
    });
    

    同样,当 Angular 看到 SecondCtrlConstructor取决于 User ,它调用 $injector.get('User')获取 User所以它可以注入(inject)它。这一次,它达到了“如果是这样”的条件。因为我们之前把 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了解更多信息。

    关于angularjs - AngularJS 服务何时重新初始化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31840584/

    相关文章:

    AngularJS $http 在多个 Controller 中使用响应

    javascript - 如何更改 Controller 中指令的值以获取 angularJS 中的新数据?

    angularjs - AngularJS上的服务器端渲染可能性

    javascript - 使用 AngularJS 组件根据类型呈现图表

    javascript - AngularJS - 如何在选择中预先选择值?

    javascript - $scope.$apply() 调用是否适合这种情况?

    javascript - Angularjs - json内容不显示

    angularjs - 将通用 Controller 功能存储在服务中,以便将它们置于隔离范围内

    javascript - 如何从 AJAX 调用 (AngularJS) 正确返回我的数据

    javascript - AngularJS - 如何使用 "require"在指令中获取指令 Controller