1

我有两个注入器,一个范围的事件永远不会到达另一个范围,即使它们应该是相同的范围......

http://jsfiddle.net/rkLzww3t/

angular.injector(['ng']).invoke(['$rootScope', function($root) {
    alert('will try to be usefull');
    $root.$on('bevent123', function() {
      alert('useful bevent123 never happens');
    });
}]);

angular.injector(['ng']).invoke(['$rootScope', function($root) {
    $root.$on('bevent123', function() {
      alert('bevent123 done from local injector, but we were not usefull');
    });
    console.log("about to $root.$broadcast('bevent123')");
    window.setTimeout(function() {
      $root.$broadcast('bevent123');
    },1000);
}]);

更新

我的主要目标是了解谷歌地图何时加载和初始化......

var app = angular.module('module_name');

function googleCallback() {
  //run does not do anything if all modules are already loaded and initialized
  //angular.module('module_name').run(['$rootScope', function($root) {
  angular.injector(['ng']).invoke(['$rootScope', function($root) {
    console.log("about to $root.$broadcast('googleLoaded')");
    $root.googleLoaded = true;
    window.setTimeout(function() {
      $root.$broadcast('googleLoaded');
      //$root.$emit('googleLoaded');
    },1000);
  }]);
}

app.run(['$rootScope',function($root) {
  var element = document.createElement("script");
  element.type = 'text/javascript';
  element.src = "https://maps.googleapis.com/maps/api/js?v=3.exp&signed_in=true&libraries=places&callback=googleCallback";
  element.async = true;
  var domElement = document.head || document.getElementsByTagName("head")[0];
  domElement.appendChild(element);
}]);

app.controller('Controller', ['$scope','$rootScope', function ($scope, $root) {
  function initMaps() {
    console.log("initMaps()");
  }
  $scope.$on('$viewContentLoaded', function() {
    console.log('$viewContentLoaded');
    if (!$root.googleLoaded) {
      console.log("waiting for googleLoaded");
      $scope.$on("googleLoaded", function() {
        console.log("about to init");
        initMaps();
      });
    } else {
      initMaps();
    }
  });
}]);//end of app.controller('Controller'...

一切正常,直到"about to init"永远不会登录到控制台并且 api 没有设置

4

2 回答 2

1

两个范围不一样。

我必须从全局函数在 $rootScope 上广播

您可以通过 DOM 元素获取应用程序的注入器。例如:

angular.element(document.body).injector()

而不是invoke你可以打电话get来获得一个角度服务并使用它。绝对比“原始”全局函数更好。

于 2015-04-29T18:45:42.707 回答
0

只注入一次 ng 并在同一个实例上调用。它现在可以工作了。

var app = angular.injector(['ng'])

app.invoke(['$rootScope', function($root) {
    alert('will try to be usefull');
    $root.$on('bevent123', function() {
      alert('useful bevent123 never happens');
    });   }])

app.invoke(['$rootScope', function($root) {
    $root.$on('bevent123', function() {
      alert('bevent123 done from local injector, but we were not usefull');
    });
    console.log("about to $root.$broadcast('bevent123')");
    window.setTimeout(function() {
      $root.$broadcast('bevent123');
    },1000);

}]);
于 2015-04-29T18:23:31.053 回答