2017-02-14 75 views
0

我在两个单独的控制器(在两个单独的JS文件中)有两段代码;一个触发一个Angular $scope.$broadcast事件,另一个触发器为$scope.$on

第一控制器(文件)片段:

var Controller1 = function($scope) { 
    $scope.triggerMyEvent = function(){ 
     $scope.$broadcast('triggeredEvent'); 
    } 
    $scope.go = function (path) { 
     $location.path(path); 
    }; 
} 

第二控制器(文件)片段:

var Controller2 = function($scope) { 
    $scope.$on('triggeredEvent',function(event){ 
     console.log('found triggered event'); 
    }); 
} 

应用程序被连接在一起,如下所示:

var app = angular.module("myApp", ["ngRoute"]); 
app.config(function($routeProvider) { 
    $routeProvider 
    .when("/page2", { 
     controller : Controller2 
     template : "/page2.html" 
    }) 
    .otherwise({ 
     template : "<p>Error</p>" 
    }); 
}); 

第一控制器由index.html文件中的ng-controller指令引用;和上面列出的其它文件,page2.html被引用,并从所述索引操作加载:

的index.html:

<body ng-controller="Controller1"> 
    <button ng-click="go('/page2.html')">Page 2</button> 
</body> 

我第一次加载这个代码被触发$scope.$broadcast事件和$scope.$on听众抓住它就好;如果我重新加载它,但$scope.$on侦听器无法捕捉它。要清楚的是,在初始加载时,事件被触发并捕获得很好;所以当重新启动我的服务器并访问页面。但是,如果我刷新页面(F5),我认为该事件正在被解雇,但未被捕获。我是新来的,所以我假定缺乏知识,但是我已经阅读了$ scope/$ rootScope和$ broadcast/$ emit/$ on之类的东西。任何帮助表示赞赏。我看到一些关于相关问题的文章;没有看到任何紧密相关的事物;虽然我也注意到这篇文章:

Angular $broadcast only updating after page refresh

AngularJS event-based communication through isolate scope

最有前途的引用,我相信有关隔离范围,但我一直没能得到任何工作还没有。

+0

我们需要看到你的代码的其余部分。这是根本没有足够的信息来回答你的问题。如何调用'triggerMyEvent'?有没有相关的模板可以显示?让我们来看看控制器定义 –

+0

嗨,谢谢,我会尝试添加更多相关的代码;但是我只是简单地调用函数并使用控制台日志记录(上面未显示)来查看它每次都被触发。 – Gedalya

+0

我更新了代码以提供更完整的图片。 – Gedalya

回答

1

$broadcast$on通过范围层次结构工作。 $broadcast向范围层次结构向其后代发送消息。任何$on侦听器都必须是消息从其广播范围的后代。如果您从$rootScope进行广播,则每个范围将是后代,并且每个范围都将能够听取该消息。所以,一个方法,以确保您的信息是所有范围内可达的是,像这样以播放它:

// just to demostrate. don't put this in a controller 
$scope.triggerMyEvent = function(){ 
    $rootScope.$broadcast('triggeredEvent'); //don't do this in a controller 
} 

理想情况下,你不想与垃圾邮件根范围。 (实际上,你应该永远不要这样做,如果你在控制器中使用$rootScope.$on,那么它会更糟,因为它每次控制器初始化时都会添加并保留一个新的侦听器)。为了找到问题的根源(双关意图),您需要关注这个层次结构,因为这会影响您的听众。这个层次的

一个例子:

<div ng-controller="ParentCtrl"> 
    <div ng-controller="ChildCtrl"> 
    </div> 
</div> 

<div ng-controller="SiblingCtrl"> 
</div> 

function ParentCtrl($scope) { 
    $scope.$broadcast('parentMsg'); 
} 

function ChildCtrl($scope) { 
    $scope.$on('parentMsg', function() { 
    // will receive message 
    }); 
} 

function SiblingCtrl($scope) { 
    $scope.$on('parentMsg', function() { 
    // will not receive message 
    }); 
} 
+1

但是这可能会引发$范围。$一个以上的时间作为一个新的$ rootScope。$广播将被创建每次函数被调用时。 理想使得它具有$范围。$广播应该是一个父类可以解决这个控制器。 – Chait

+0

例如,在服务中,没有本地范围。如果你想广播一条消息,你必须使用'$ rootScope'。但是,它不应该真的在控制器内部使用 –

+0

是的,我完全同意。如你所说,我们需要更多的信息,如从 – Chait