2016-05-10 4 views
2

Я парование установки для моего проекта:Угловое, общаться между модулями

  • mainApp основной угловой модуль, содержащий EventBus автокрепеж
  • app1 первый модуль с mainApp впрыскивается
  • app2 второй модуль с mainApp впрыскивается

app1 и app2 - это два модуля, размещенные на одной странице, оба имеют вложенный файл mainApp.

Я пытаюсь установить связь между app1 и app2 с использованием фабрики EventBus, которая определена в mainApp. К сожалению, я не могу заставить его работать (приложение 1 не захватывает событие app2 и наоборот).

Как это разрешить? Я принимаю неправильный подход?

EventBus.subscribe("App1Ctr.event", function (event, data) { 
    console.log("App2handler"); 
    $scope.name = data.newVal; 
}); 


$scope.fireEvent = function() { 
    EventBus.broadcast("App2Ctr.event", {"newVal": "App2Ctr"}); 
}; 

Вот plnkr

+1

Не могли бы вы немного добавить что-то вроде: 1) Каков ваш ожидаемый результат/поведение? 2) Что такое текущий выход/поведение? –

+0

@ Ожидаемый вывод KhalidHussain: у меня есть несколько модулей и вы хотите, чтобы все они прослушивали передачу событий из одного основного (введенного) модуля. текущий выход - никаких событий не было обнаружено ни в app1, ни в app2 – shagrin

+0

Не могли бы вы просто добавить 'console.log' в свой plnkr и распечатать текущий вывод? –

ответ

0

Вы должны изменить способ зависимостей впрыскивается. Ваш main.js должен содержать следующее:

var mainApp = angular.module("mainApp", ["app1", "app2"]) 

Ваши два app1.js и app2.js может упасть требование о зависимостях от mainApp:

var app1 = angular.module("app1", []) 

и

var app2 = angular.module("app2", []) 

Ваш код инициализации в index.html становится

<script> 
    angular.element(document).ready(function() { 
     angular.bootstrap(document, ["mainApp"]); 
    }); 
</script> 

Вам также нужно будет изменить ссылки на {{name}}, чтобы они включали точку (из-за всей прототипической наследования в угловом). См. this plunkr и this question для получения более подробной информации о $broadcast, $emit, $on и $rootScope.

+0

, к сожалению, я не могу этого сделать, так как это будет вверх-вниз по структуре проекта. – shagrin

+0

Ваш 'main.js' в настоящее время содержит только фабрику для' EventBus', поэтому вы можете переименовать ее в 'eventBus.js'. Альтернативой является создание ваших дочерних элементов 'app1' и' app2' общего родителя, использование '$ scope. $ Emit' для дочерних элементов и перенос этих родительских повторных событий вниз по иерархии с использованием' $ scope. $ Broadcast' , как показано в [этом ответе] (http://stackoverflow.com/a/31358365/1159164) –

+0

Пример работает с разными контроллерами, но как я могу установить угловые приложения/модули? – shagrin

0

Мне удалось найти решение. Метод трансляции в EventBus должен выглядеть примерно так:

_broadcast = function(eventName, data) { 
    console.log("EventBus broadcast: " + eventName); 
    angular.element(document.getElementById('app1')).scope().$root.$emit(eventName, data); 
    }; 

Поскольку он должен получить угловое приложение по идентификатору, я буду использовать в дополнении EventDispatcher справиться с этим.

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