2015-06-25 2 views
0

Мы пытаемся разработать приложение с использованием phonegap onsen и angularJS.угловая функция вызова от разных контроллеров

Я пытаюсь вызвать функцию из разных контроллеров. Я видел много документации о том, как это сделать, например this

Но по какой-то причине это не работает для меня. Вот мой код до сих пор.

module.run(function ($rootScope) { 
    $rootScope.$on('some-event-here', function (event, data) { 
     console.log('1'); 
     $rootScope.$emit('show-dialog-of-some-event', data); 

     //I also tried 
     //$rootScope.$broadcast('show-dialog-of-some-event', data); 
    }); 
}); 

module.controller('controller1', ['$scope', '$http', function($scope, $http) { 
    $scope.proceed = function() { 
     console.log('0'); 
     $scope.$emit('some-event-here', {}); 
    } 
}]); 

module.controller('controller2', ['$scope', '$http', function($scope, $http) { 
    $scope.$on('show-dialog-of-some-event', function (event, data) { 
     console.log('2'); 
     ons.createDialog('some-dialog.html').then(function(dialog) {       
      //some code here 
     }); 
    }); 
}]); 

Он отображается на консоли «0» и «1», но не показывает «2».

Это может быть легкой проблемой, но я не могу найти проблему с моим кодом.

Заранее спасибо.

+0

Попробуйте использовать '$ rootScope. $ Broadcast' вместо' $ emit' в вашей функции запуска –

+0

@NexusDuck Я уже пробовал. $ rootScope. $ broadcast ('show-dialog-of-some-event', data); - Все еще не работает. – Eddie

+0

Нечетный, я сделаю plnkr и протестирую его. Кстати, я не вижу другого модуля, на который вы ссылаетесь в своем вопросе здесь, это весь соответствующий код? –

ответ

0

Если вы общаетесь между контроллерами двойников и от родительского контроллера к контроллеру ребенка вы должны использовать $ Scope. $ Радиопередачу, но если вы хотите общения с ребенком родителя, вы должны использовать $ объем. $ Испускают

+0

Что делать, если вы пытаетесь установить связь между родителем и дочерним? – Eddie

+0

но трансляция не работает на моем конце. Я попробовал и, похоже, не работает на меня – Eddie

+0

Я создаю скрипку для вашей проблемы: до этого вы можете проверить эту ссылку: http://toddmotto.com/all-about-angulars-emit-broadcast-on- публикация-подписка/очень хорошее объяснение –

1

Я думаю, что может произойти, что вы объявляете обработчик событий для события «show-dialog-of-some-event» в локальной области контроллера2, то есть $ scope. Вы испускаете событие в $ rootScope. Испускаемые события выходят из строя вниз, поэтому событие «show-dialog-of-some-event» не «окунается» из области $ rootScope в $ scope. Вместо этого вы можете определить обработчик событий для «show-dialog-of-some-event» в корневой области, например.

$rootScope.$on('show-dialog-of-some-event', function(e,d) {}); 
0

2 вещи неправильно с вашим кодом:

1: $broadcast пузыри события вниз по иерархии областей видимости, $emit для барботирования их иерархию области видимости, а не использовать это:

$rootScope.$broadcast('show-dialog-of-some-event', data); 

Для получения дополнительной информации см. Этот ответ: $rootScope.$broadcast vs. $scope.$emit

2: run функция вашего модуля будет ex ecuted прежде чем ваш контроллер будет прикрепить обработчик события для этого события, поэтому мероприятие прошло уже к тому времени, настроенному обработчик событий в контроллере:

Опять же, посмотрите этот ответ AngularJS app.run() documentation?

Таким образом, решение ваш ответ:

  • изменение $emit к $broadcast
  • шаг позже $broadcast вызова в жизненном цикле так controller будет присоединили его слушателем

Вот plunkr, где я звоню $broadcast позже в жизненном цикле (в данном случае, когда окно нагрузки):

http://plnkr.co/edit/W7efiKqIlu4va4AcBTbG

+0

Я передал module.run (функция ($ rootScope) под всеми кодами, но все еще не работает. – Eddie

+0

@EddieWho Не позднее вашего файла, позже в жизненном цикле, запуск будет выполнен до вашего код контроллера будет обрабатываться независимо от того, где вы его положили –

+0

Простите мое невежество .. Как вы можете это сделать? – Eddie

0

Если вам не нужно обрабатывать ничего на rootscope вас могу просто вводить $ rootScope в контроллер

module.controller('controller1', ['$scope', '$http', '$rootScope', function($scope, $http, $rootScope) { 
    $scope.proceed = function() { 
     console.log('0'); 
     $rootScope.$boardcast('some-event-here', {}); 
    } 
}]); 

module.controller('controller2', ['$scope', '$http', function($scope, $http) { 
    $scope.$on('some-event-here', function (event, data) { 
     console.log('2'); 
    }); 
}]); 

это менее чистое, чем при использовании сервиса, но вы можете использовать этот шаблон, если это не слишком часто.

Смежные вопросы