我正在创建一个角度提供程序(因为它需要是可配置的),我需要它在应用程序启动时初始化一次,所以我在我的提供程序的$ 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()放到了函数中。
如果我将服务注入到需要它的指令中,我知道该函数在页面加载时运行,这就是我想要的,但每次将它注入另一个指令时它会运行吗?如果是这样,那么我会得到多个附加到窗口的事件,当断点发生变化时,它会广播多个事件,这反过来会触发我的所有指令重新布局,这将是一场噩梦。
基本上我希望服务在首次使用时初始化一次。将单个resize事件附加到窗口,并在断点发生更改时广播单个事件。
答案 0 :(得分:1)
第一次注入时,您的服务将被实例化一次。
来自Angular documentation on providers:
Angular的所有服务都是单身人士。这意味着注射器 最多使用一次配方来创建对象。那么注射器 缓存未来所有需求的参考。
实例化的实际顺序取决于不同范围之间的依赖关系。 Angular对依赖项进行排序,因此在使用它们的代码之前会实例化所需的依赖项。顺便说一句,这就是Angular如何检测提供程序依赖项中的循环。