仅注册一次事件侦听器一次 AngularJS

我用我的控制器播放一个活动 navbar 到另一个控制器,但如果我多次初始化控制器 /当我继续通过应用程序/, 在我的活动上执行的函数
$on

, 它开始几次,因为它是几次注册的。


$rootScope.$on/'submitBookingDialog', function//{
submitBookingDialog//;
}/;


我如何防止
submitBookingDialog//

, 发生了不止一次的事情?

我发现

, 但我不知道它是否是完美的。
已邀请:

八刀丁二

赞同来自:

首先,您需要发送活动
$rootScope

? 如果没有,您可以简单地注册您的事件处理程序
$scope

. 每当控制器的范围都将被销毁时,事件处理程序将被销毁。 然后你通过
$scope.$emit

或者
$scope.$broadcast

根据控制器的层次结构。

但是,您需要做的就是摧毁您的活动侦听器, - 这是取消注册的函数,在注册侦听器时返回:


var offSubmitBookingDialog = $rootScope.$on/'submitBookingDialog', function//{
submitBookingDialog//;
}/;

$scope.$on/'$destroy', function// {
// Call the deregistration function when the scope is destroyed
offSubmitBookingDialog//;
}/;

龙天

赞同来自:

它似乎为我制作:


var removeListener = $rootScope.$on/'submitBookingDialog', function//{
submitBookingDialog//;

// Remove listener
removeListener//;
}/;

风见雨下

赞同来自:

对于后代,我完成了我所做的:


.run/function/$rootScope/ {
$rootScope.once = function/e, func/ {
var unhook = this.$on/e, function// {
unhook//;
func.apply/this, arguments/;
}/;
};
}/


因为我不断需要在几个地方做到这一点,所以它只是结束了更清洁的东西。

在您的应用程序模块中,您可以打电话
once

反而
$on

:



$rootScope.once/'submitBookingDialog', function// {
submitBookingDialog//;
}/;

詹大官人

赞同来自:

我遇到了类似的情况,所以我写了一个小图书馆来制作 pub/sub 更简单。

https://github.com/callmehiphop/hey

快网

赞同来自:

也许您必须取消订阅控制器以销毁事件。


var removeSubmitBookingDialog = $rootScope.$on/'submitBookingDialog',submitBookingDialog/;
$scope.$on/"$destroy", removeSubmitBookingDialog/;

要回复问题请先登录注册