angularjs中服务(或工厂)的生命周期是什么?何时重新初始化?
答案 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”条件并且:
new User()
。$injector.cached
。现在让我们说我们需要第二次注入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仅在实例化时实例化服务 应用程序组件取决于它。
- 单身人士 - 依赖于服务的每个组件都会获得对单个实例的引用 由服务工厂生成。