angularjs中,我的路由大概如下
$stateProvider
//index
.state(
"index",{
url:"",
abstract:true,
templateUrl:"pages/menu.html",
controller:"menuCtrl"
})
.state(
"index.jianzhi",
{
url:"/jianzhi",
views:{
"jianzhi":{
templateUrl:"pages/jianzhi.html",
controller:"jianzhiCtrl"
}
}
})
.state(
"index.jiajiao",
{
url:"/jiajiao",
views:{
"jiajiao":{
templateUrl:"pages/jiajiao.html",
controller:"MyCtrl"
}
}
})
//login
.state(
"login",{
url:"/login",
templateUrl:"pages/login.html",
controller:"LoginCtrl"
})
在LoginCtrl里,我调用service进行广播
.service('EventService', ['$rootScope', function($rootScope){
var Messenger = {
broadcast:function(EventName){
setTimeout(function(){
$rootScope.$broadcast(EventName);
},100)
}
};
return Messenger;
}])
在menuCtrl里,我来接受消息
$scope.$on("update",function(){
console.log('update');
getUserName();
});
按理说这时on事件应该接受到消息了,但是实际情况却没有,把scope换成rootscope正常接收到消息
请问这是为什么
谢谢
欢迎参考:angularJS的controller之间如何正确的通信
$broadcast
和$emit
压根就不是这么用的!!!
1、首先$rootscope
是所有$scope
的父级,也就是所有的$scope
都是原型继承于$rootscope
,如果需要传参,直接在$rootscope
上定义属性(全局属性),在其他scope中直接调用这个全局属性即可
2、$broadcast
和$emit
通常用于互相隔离的controller
之间的通信
如果这样达不到你的要求那就在问题中描述一下你的需求
service和controller并不需要监听才能通信,监听一般都是controller之间的通信。楼上说的监听之间的父级和子级并不是$scope和$rootScope的关系,父级子级说的是controller之间的包含和被包含关系。不过如果你把$on放到$rootScope上去,就处于可通信状态了,否则监听不到,你可以理解为他们不在同一个容器中。
按照你的路由所示,LoginCtrl
和MenuCtrl
是两个不同路由的controller,你在页面应该是用了ng-view,那么不同的路由相当于不同的页面,在/login
路由下,angular只会实例化对应的LoginCtrl
,此时页面根本没有MenuCtrl
,试问即使$rootScope
广播了update事件,也只能LoginCtrl
接受得到,更换$rootScope
能接收到是因为angular中的广播会分发给自己的
$rootScope是所有scope的父级
它的广播($broadcast)和监听($on) 可以在无交集的controller间使用
$scope 的 $broadcast 和 $on 是用于作用域有交集(父子关系)controller间事件传递 有别于$rootScope
https://toddmotto.com/all-about-angulars-emit-broadcast-on-publish-subscribing/