Angular 提供程序服务需要 init 函数运行一次



我正在创建一个角度提供程序(因为它需要可配置),我需要它在应用程序启动时初始化一次,所以我在我的提供程序的$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 检测提供程序依赖项中的周期的方式。

最新更新