Angular在提供程序中注入$ rootScope

时间:2015-02-17 18:01:38

标签: javascript angularjs dependency-injection

我无法在提供者内部访问$ rootScope。我看了很多有角度的其他模块实现。它与我的实施方式相同。 怎么了? 它尝试将urload作为一个单独的函数(类似于其他getValue函数)它不起作用

错误是$ emit未定义

 define(['angularAMD'], function () {

        var contextServiceModule = angular.module('contextService', []);

        var contextService = function () {

            var context = {};

            this.$get = ['$rootScope', function ($rootScope) {
                console.log($rootScope);
                return function (){
                    return {
                        init: init,
                        getValue: getValue,
                        setValue: setValue,
                        urlLoad:  function () {                      
                            $rootScope.$emit('onInit', {});/// error here
                        }
                    };
                };
            }];

            this.init = function () {
                return context;
            };

            this.getValue = function (key) {
                var value = context[key] ? context[key] : null;
                return value;
            };

            this.setValue = function (key, value) {
                context[key] = value;
            };



        }

        contextServiceModule.provider('contextService', contextService);

    });

4 个答案:

答案 0 :(得分:6)

您无法将$ rootScope注入提供者$ get函数,因为它尚不可用。但是,您可以在调用函数时手动注入它。

this.$get = ['$injector', function ($injector) {
    return function (){
        return {
            init: init,
            getValue: getValue,
            setValue: setValue,
            urlLoad:  function () {
                 var $rootScope = $injector.get('$rootScope');
                 console.log($rootScope);
                 $rootScope.$emit('onInit', {});/// error here
            }
        };
    };
}];

答案 1 :(得分:1)

在配置阶段创建角度提供程序,并且在应用程序运行阶段之前$ rootScope不可用。这里有几个Angular资源和一个类似的问题:

https://docs.angularjs.org/guide/module

https://docs.angularjs.org/guide/providers

https://stackoverflow.com/a/10489658/3284644

答案 2 :(得分:1)

这就是我如何让$ rootScope广播从React.jsAngular的消息。 如果您的ng-view不在身体中,请使用您的function $broadcast(event, args]) { angular.element('body').injector().invoke([ '$rootScope', '$timeout', ($rootScope, $timeout) => { args.unshift(event); $timeout(() => { $rootScope.$broadcast.apply($rootScope, args); }); } ]);

Something: different

Date: 22:23:32

}

从这里得到它: https://www.bimeanalytics.com/engineering-blog/you-put-your-react-into-my-angular/

答案 3 :(得分:0)

!!重要提示:以下解决方案在缩小后无法正常工作。为此,您需要进行依赖注入,但是不能在配置阶段调用$ get

app.provider('someHandler', function() {
    this.$get = function ($rootScope) {
        function doBroadcast(words) {
            $rootScope.$broadcast(words);
        }

        return {
            shout: function (words) {
                doBroadcast(words);
            }
        }
    }
});

如果您需要在 config阶段中使用,则可以执行以下操作

app.config(['someHandlerProvider', function(someHandlerProvider) {
    someHandlerProvider.$get().shout('listen up');
}

在运行过程中,您只需someHandler.shout('listen up')