【发布时间】:2015-10-28 16:56:26
【问题描述】:
angularjs 中服务(或工厂)的生命周期是什么,何时重新初始化?
【问题讨论】:
标签: angularjs angularjs-service angularjs-controller
angularjs 中服务(或工厂)的生命周期是什么,何时重新初始化?
【问题讨论】:
标签: angularjs angularjs-service angularjs-controller
服务/工厂仅在第一次使用时初始化一次。来自文档:https://docs.angularjs.org/guide/services
Angular 服务是:
- 延迟实例化 - Angular 仅在 应用程序组件依赖于它。
- Singleton – 依赖于服务的每个组件都获得对单个实例的引用 由服务工厂生成。
【讨论】:
当 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,它会达到“如果不是”条件并且:
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。假设我们有依赖于User 的myDirective。同样的事情也会发生 - 它会在 $injector.cached 中找到它,因此不会实例化它。
这称为Singleton pattern。当您不想多次实例化某些东西时使用它。 Angular 将其用于服务,因此它们不会被多次实例化。工厂也是如此(对于提供者来说可能也是如此;对于值和常量可能不是这样)。
有关更多信息,请参阅https://medium.com/@adamzerner/dependency-injection-in-angular-18490a9a934。
【讨论】: