angularjs $ boadcast和$ on无法使用angular.injector

时间:2017-11-17 12:10:27

标签: angularjs broadcast

我在收到推送通知时尝试将一个函数调用到一个控制器,传递给$ broadcast / factory,但是当通过angular.injector调用时,广播不起作用,这里是我的代码的安静:

push.js

window.onNotification = function(data) {
        angular.injector(['ng', 'myApp']).get("laFactory").PushReceived(data.additionalData); // --> work fine
    };
         window.push = PushNotification.init({
             "android": {
                 "senderID": "123456789",
                 "icon": "system",
                 "forceShow": true
             }
         });

         window.push.on('notification', window.onNotification);

window.onNotification = function(data) { angular.injector(['ng', 'myApp']).get("laFactory").PushReceived(data.additionalData); // --> work fine }; window.push = PushNotification.init({ "android": { "senderID": "123456789", "icon": "system", "forceShow": true } }); window.push.on('notification', window.onNotification);

laFactory.js

.factory('laFactory', ['$http', '$rootScope', function ($http, $rootScope) {
    var laFactory = {};

    laFactory.PushReceived = function(data) {           
       $rootScope.$broadcast('handleNotify', {}); // --> don´t work when called by angular.injector!!! why not?!
    };

    $rootScope.$broadcast('handleNotify', {}); // this work fine

    return laFactory;
}

myController.js .factory('laFactory', ['$http', '$rootScope', function ($http, $rootScope) { var laFactory = {}; laFactory.PushReceived = function(data) { $rootScope.$broadcast('handleNotify', {}); // --> don´t work when called by angular.injector!!! why not?! }; $rootScope.$broadcast('handleNotify', {}); // this work fine return laFactory; }

2 个答案:

答案 0 :(得分:0)

目前尚不清楚为什么要以这种方式获得服务?

非常确定您正在使用的语法是创建一个新的注入器,如果您想获得现有的注入器,那么您将使用类似的东西:

angular.element(document).injector()

即便如此,我仍然想知道为什么你不能正常注入服务。 https://docs.angularjs.org/api/ng/function/angular.injector

啊,我现在看到你正试图将其置于角度背景之外......上面的代码片段会起作用,但认为通常只是将通知代码包装在服务中而不是尝试使用角度以外的角度东西带来其他东西"进入折叠"或搜索为您工作的现有模块。

答案 1 :(得分:0)

不确定它是否最好,但确实有效:

angular.element(document).injector().invoke(["laFactory", function(laF) {
  laF.PushReceived({});
}]);

http://plnkr.co/edit/uVHZKxUjRErbxt2dR3lw?p=preview