vja*_*n27 6 angularjs angularjs-service angularjs-controller
angularjs中服务(或工厂)的生命周期是什么?何时重新初始化?
Ada*_*ner 10
当Angular引导时,它将服务的构造函数附加到关联模块.这发生一次.
angular
.module('myApp')
.service('User', function UserConstructor() {
// stuff
});
Run Code Online (Sandbox Code Playgroud)
当您尝试运行控制器或某些依赖于某项服务的东西时,Angular会为您注入它.
app.controller('FirstCtrl', function FirstCtrlConstructor(User) {
// User is available here
});
Run Code Online (Sandbox Code Playgroud)
在引擎盖下,角度使用这个叫做$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
};
Run Code Online (Sandbox Code Playgroud)
所以,当看到角,它需要注入User到FirstCtrlConstructor,它要求$injector.get('User')得到User.由于它User之前没有注入任何其他地方,它将达到"如果不是"的条件,并且:
new User().$injector.cached下次.现在让我们说我们需要User第二次注入:
app.controller('SecondCtrl', function SecondCtrlConstructor(User) {
// stuff
});
Run Code Online (Sandbox Code Playgroud)
再一次,当Angular认为SecondCtrlConstructor依赖于User它时,它会调用$injector.get('User')以获得User它可以注入它.这一次,它达到"如果是这样"的条件.自从我们之前投入使用以来,我们就User在$injector.cached那里找到了它.因此,User不会再次实例化.
说我们有一个ThirdCtrl也取决于User.它也会找到它$injector.cached,因此它不会实例化UserConstructor.说我们有myDirective这取决于User.同样的事情会发生 - 它会找到它$injector.cached,因此不会实例化它.
这称为Singleton模式.当您不想多次实例化某些内容时使用它.Angular将此用于服务,因此它们不会多次实例化.对于工厂来说也是如此(对于提供者来说也是如此;对于值和常量可能并非如此).
有关更多信息,请参阅https://medium.com/@adamzerner/dependency-injection-in-angular-18490a9a934.
服务/工厂仅在第一次使用时初始化一次。来自文档:https : //docs.angularjs.org/guide/services
Angular服务包括:
- 延迟实例化– Angular仅在应用程序组件依赖服务时实例化服务。
- 单例–依赖于服务的每个组件都将引用由服务工厂生成的单个实例。
| 归档时间: |
|
| 查看次数: |
2172 次 |
| 最近记录: |