gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 13:22:40 37 4
gpt4 key购买 nike

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/

    37 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com