首页 > angularjs中rootscope和子scope通信问题

angularjs中rootscope和子scope通信问题

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上去,就处于可通信状态了,否则监听不到,你可以理解为他们不在同一个容器中。


按照你的路由所示,LoginCtrlMenuCtrl是两个不同路由的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/

【热门文章】
【热门文章】