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'來查看被銷燬的控制器是否仍然處理一個事件監聽器。 –

相關問題