(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
由于
答案 0 :(得分:1)
问题是您是通过状态加载控制器。这意味着只有在状态变为活动状态时才会初始化(即导航到html)。
如果您将控制台日志添加到profileCtrl,您会看到它在页面处于活动状态之前不会被触发。
答案 1 :(得分:0)
如果没有调用控制器,Angular不会加载控制器。 可以把它想象成一个单独的对象,它会在尝试运行它之前不会初始化。
在您的情况下,您为特定路线设置了一个控制器,这意味着它只有在您转到其路线地址后才会运行。
你真正想要做的是拥有一些指令Angular Directive 这将控制您将在主页面上加载的菜单栏,也可能是每隔一页。 对于主页,您应该有一个不同的控制器,只有当用户在页面上时才会激活。
作为旁注,不要假设"家庭"离开主页(Angular destroy)后,控制器将可用。