我正在创建一个角度提供程序(因为它需要可配置),我需要它在应用程序启动时初始化一次,所以我在我的提供程序的$get函数中有一个 init() 函数,它不会作为公共的一部分返回。init() 函数还将 resize 事件附加到窗口。这是一个非常简化的版本...
angular.module('my.services').provider('breakpoints', function(){
var breakpoints = [];
var currentBreakpoint = {};
init();
return({
$get: instantiate
});
function instantiate($rootScope, $window) {
_initService();
// Public API
return({
current: current,
});
function current() {
return currentBreakpoint;
}
function _windowWidthChanged(){
// Check if breakpoint has changed and broadcast event if it has
}
function _initService(){
angular.element($window).bind('resize', _windowWidthChanged);
_windowWidthChanged();
}
}
});
我的问题是,这个 initService() 函数什么时候运行?
我知道如果我不将其注入任何控制器/指令等,它就不会运行,即使它是注入到我的应用程序中的模块的一部分。我知道这一点,因为我在函数中放了一个 console.log()。
如果我将服务注入到需要它的指令中,我知道该函数在页面加载时运行,这就是我想要的,但是每次注入到不同的指令中时它都会运行吗?如果是这样,那么我将获得多个附加到窗口的事件,并且在断点更改时它会$broadcast多个事件,这反过来会触发我的所有指令重新布局,这将是一场噩梦。
基本上,我希望该服务在首次使用时初始化一次。将单个调整大小事件附加到窗口,并在断点更改时广播单个事件。
首次注入服务时,将实例化一次。
来自关于提供者的 Angular 文档:
Angular 中的所有服务都是单例。这意味着喷油器 每个配方最多使用一次来创建对象。然后喷油器 缓存引用以满足所有未来需求。
实例化的实际顺序取决于不同作用域之间的依赖关系。Angular 对依赖项进行排序,以便在使用它们的代码之前实例化所需的依赖项。顺便说一下,这就是 Angular 检测提供程序依赖项中的周期的方式。