无法从其他控制器调用$ on

时间:2017-07-20 07:47:13

标签: javascript angularjs angular-ui-router

(function(app) {


app.config(function($stateProvider, $httpProvider, $urlRouterProvider) {
  //region Registering States

  $urlRouterProvider.otherwise('/home');

  var dashboard = {
    name: 'home',
    url: '/home',
    templateUrl: 'home.html',
    controller: 'homeCtrl'
  };

  var home = {
    name: 'profile',
    url: '/profile',
    templateUrl: 'profile.html',
    controller: 'profileCtrl'
  };



  $stateProvider.state(dashboard);
  $stateProvider.state(home);
  //endregion



});

app.controller('homeCtrl', ['$rootScope','$scope', function($rootScope,$scope) {

   $rootScope.pageTitle = "home";
   $scope.callEvent = function(){
     $rootScope.$broadcast('newEvent',"data");
   }


}]);

 console.log('called');
}(angular.module('app', ['ui.router'])));

2'控制器:

(function(app) {
app.controller('profileCtrl', ['$rootScope','$scope', function($rootScope,$scope) {

  $rootScope.pageTitle = "profile";

  $rootScope.$on('newEvent',function(ev,data){
    alert('Event fired from home');
  });


  $scope.$on('newEvent',function(ev,data){
    alert('Event fired from home');
  });

}]);
 }(angular.module('app')));

带2个控制器的应用程序:

1个控制器:使用$ broadcast

发起了一个事件

2控制器:捕获从第一个控制器触发的事件。 但无法做到这一点。

注意:如果html页面加载一次(2' nd控制器),则会触发$ on事件,否则它不会监听任何事件。

为了更好地理解,我创建了plunkr

请先查看代码

@vojta

由于

2 个答案:

答案 0 :(得分:1)

问题是您是通过状态加载控制器。这意味着只有在状态变为活动状态时才会初始化(即导航到html)。

如果您将控制台日志添加到profileCtrl,您会看到它在页面处于活动状态之前不会被触发。

答案 1 :(得分:0)

如果没有调用控制器,Angular不会加载控制器。 可以把它想象成一个单独的对象,它会在尝试运行它之前不会初始化。

在您的情况下,您为特定路线设置了一个控制器,这意味着它只有在您转到其路线地址后才会运行。

你真正想要做的是拥有一些指令Angular Directive 这将控制您将在主页面上加载的菜单栏,也可能是每隔一页。 对于主页,您应该有一个不同的控制器,只有当用户在页面上时才会激活。

作为旁注,不要假设"家庭"离开主页(Angular destroy)后,控制器将可用。