Как запретить angular создавать несколько экземпляров контроллера каждый раз, когда мы используем $state.go

Я использую маршрутизатор пользовательского интерфейса для угловой маршрутизации. Каждый раз, когда вызывается $state.go(), создается новый экземпляр контроллера. У меня здесь есть события $rootScope. Поэтому каждый раз, когда я хочу распечатать любой журнал (используя console.log()) или инициировать событие из-за пределов контроллера, оно выполняется несколько раз, то есть столько же раз, сколько экземпляров контроллера. Как я могу решить эту проблему? Я хочу выполнить только один раз. Любая помощь приветствуется. Спасибо за ответ заранее. фрагмент кода.

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

Из другого контроллера я излучаю.

$rootScope.$emit("connect_device")

person Bhavesh Maheshwari    schedule 30.01.2017    source источник
comment
Можете ли вы предоставить свой код, пожалуйста?   -  person Mistalis    schedule 30.01.2017


Ответы (1)


Вам не хватает некоторых destroyhandling в вашем экземпляре контроллера. События, подписанные на $rootScope, должны быть отписаны при уничтожении. Контроллер действительно создается $state.go, и ваши обработчики событий присоединяются к каждой фазе создания контроллера. Если не уничтожить эти прослушиватели событий, это приведет к такому поведению.

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

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

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

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

}]);

При вызове cleanUpFunc() в $destroy ваш прослушиватель событий для события eventName будет отменен, и у вас больше не будет утечки памяти, когда ваш контроллер будет очищен.

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

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

person daan.desmedt    schedule 30.01.2017
comment
Спасибо daan.desmedt за ответ. Я попробовал метод, но проблема не решена. Событие по-прежнему запускается дважды, когда я снова захожу на ту же страницу. - person Bhavesh Maheshwari; 31.01.2017
comment
Можете ли вы поделиться кодом? Трудно решить, не видя никакого соответствующего кода. Насколько вы уверены в уничтожении событий? Может быть, поработать с каким-нибудь console.logs, чтобы увидеть, обрабатывает ли уничтоженный контроллер еще прослушиватель событий. - person daan.desmedt; 31.01.2017