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, и ваши eventlistereners присоединяются к каждой стадии создания контроллера. Не уничтожая этих участников событий, это приведет к такому поведению.

См. Следующий пример кода, чтобы указать, как вы можете решить свою проблему.

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 события будет не-подписался, и вы больше не будете утечки памяти, когда контроллер получает очищен.

Если нет разрушения событий, даже если контроллер уже уничтожен, все участники будут активны. И в качестве возможного результата вы заметите, что это может вызвать несколько функций при одном событии.

Вне курса без каких-либо реальных примеров кода показано, как вам нужно иметь дело с events на контроллере destroy.

+0

Спасибо daan.desmedt за ответ. Я попробовал метод, но проблема не решена. Событие по-прежнему запускается дважды, когда я снова попадаю на ту же страницу. –

+0

Можете ли вы поделиться некоторым кодом? Трудно решить, не видя никакого соответствующего кода. Насколько вы уверены в том, что события будут уничтожены? Возможно, работайте с некоторыми 'console.logs', чтобы узнать, все ли обработанный контроллер по-прежнему обрабатывает прослушиватель событий. –