0

我正在使用UI路由器进行角度路由。每次$ state.go()被称为正在创建的控制器的新实例。我在这里有$ rootScope事件。因此,每次我想打印任何日志(使用console.log())或从控制器外部触发事件时,它都会执行多次,即与控制器实例的时间数相同。我该如何解决这个问题?我只想执行一次。任何形式的帮助表示赞赏。感谢您提前回答。 代码片段。

$rootScope.$on('connect_device',function() { 
     connect_device($rootScope.mac_address,$rootScope.device_name);  
    }); 

从我发出的不同控制器。

$rootScope.$emit("connect_device") 
+2

你能提供你的代码吗? – Mistalis

回答

0

您在控制器实例中缺少一些destroy处理。 被登记为$rootScope的事件必须在销毁后取消订阅。控制器确实创建于$state.go,并且您的eventlistener附加在每个控制器创建阶段。不破坏这些事件侦听者会导致这种行为。

请参阅以下示例代码以指出如何解决问题。

angular.module('moduleName') 
    .controller('controllerName', ['$rootScope', '$scope', function ($rootScope, $scope) { 

    var cleanUpFunc = $rootScope.$on('eventName', function { 
     // listener actions 
    }); 

    $scope.$on('$destroy', function() { 
     cleanUpFunc(); 
    }); 

}]); 

通过调用cleanUpFunc()在$破坏,事件侦听器的eventName事件将取消订阅的,当你的控制器被清理,你将不再泄漏内存。

当事件没有破坏时,即使控制器已经被销毁,事件监听器仍然是活动的。作为一个可能的结果,你会注意到这可以在一个事件中调用多个函数。

如果没有任何实际的代码示例,下面的例子说明如何在控制器destroy上处理events

+0

感谢daan.desmedt的回答。我试过这个方法,但问题没有解决。当我再次来到同一页面时,事件仍然触发两次。 –

+0

你可以分享一些代码吗?没有看到任何相关的代码很难解决。你对这些被摧毁的事件有多确定?也许可以使用一些'console.logs'来查看被销毁的控制器是否仍然处理一个事件监听器。 –

相关问题