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/