Angular provider服务需要init函数运行一次

时间:2016-02-22 16:00:43

标签: javascript angularjs angularjs-service

我正在创建一个角度提供程序(因为它需要是可配置的),我需要它在应用程序启动时初始化一次,所以我在我的提供程序的$ 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事件附加到窗口,并在断点发生更改时广播单个事件。

1 个答案:

答案 0 :(得分:1)

第一次注入时,您的服务将被实例化一次

来自Angular documentation on providers

  

Angular的所有服务都是单身人士。这意味着注射器   最多使用一次配方来创建对象。那么注射器   缓存未来所有需求的参考。

实例化的实际顺序取决于不同范围之间的依赖关系。 Angular对依赖项进行排序,因此在使用它们的代码之前会实例化所需的依赖项。顺便说一句,这就是Angular如何检测提供程序依赖项中的循环。