У меня есть footerController и codeScannerController с различными представлениями.
angular.module('myApp').controller('footerController', ["$scope", function($scope) {}]);
angular.module('myApp').controller('codeScannerController', ["$scope", function($scope) {
console.log("start");
$scope.startScanner = function(){...
Когда я нажимаю на <li>
файл footer.html, я должен получить это событие в codeScannerController.
<li class="button" ng-click="startScanner()">3</li>
Я думаю, что это можно реализовать с помощью $on
и $broadcast
, но я не знаю, как и не могу найти примеры нигде.
javascript
angularjs
Алиса Полански
источник
источник
$scope.$apply()
необходим только при изменении модели вне угловой структуры (как в setTimeout, обратном вызове диалога или обратном вызове ajax), другими словами,$apply()
он уже запущен после завершения всего кода в.$on()
.Во- первых, краткое описание
$on()
,$broadcast()
и$emit()
:.$on(name, listener)
- прослушивает конкретное событие по заданномуname
.$broadcast(name, args)
- Трансляция события через$scope
всех детей.$emit(name, args)
- Создайте событие в$scope
иерархии для всех родителей, включая$rootScope
На основе следующего HTML (см. Полный пример здесь ):
Запущенные события будут проходить
$scopes
следующим образом:$scope
$scope
то$rootScope
$scope
затем контроллером 3$scope
$scope
то$rootScope
$scope
$scope
,$scope
затем контроллером 2$rootScope
$rootScope
и$scope
все контроллеры (1, 2 , то 3)$rootScope
JavaScript для запуска событий (снова, вы можете увидеть рабочий пример здесь ):
источник
Вы должны знать, что префикс $ относится к угловому методу, префикс $$ относится к угловым методам, которые следует избегать.
ниже приведен пример шаблона и его контроллеров, мы рассмотрим, как $ broadcast / $ on может помочь нам достичь того, чего мы хотим.
Контроллеры
Мой вопрос к вам, как вы передаете имя второму контроллеру, когда пользователь нажимает на регистр? Вы можете предложить несколько решений, но одно из них, которое мы собираемся использовать, - это использование $ broadcast и $ on.
$ широковещание против $ emit
Что мы должны использовать? $ broadcast будет направлен вниз ко всем дочерним элементам dom, а $ emit направит противоположное направление ко всем элементам dom предков.
Лучший способ избежать выбора между $ emit или $ broadcast - это канал из $ rootScope и использование $ broadcast для всех его дочерних элементов. Что делает наш случай намного проще, так как наши доминантные элементы - братья и сестры.
Добавление $ rootScope и позволяет трансляцию
Обратите внимание, что мы добавили $ rootScope и теперь используем $ broadcast (broadcastName, arguments). Для broadcastName мы хотим дать ему уникальное имя, чтобы мы могли его перехватить в нашем secondCtrl. Я выбрал БУМ! просто для удовольствия. Второй аргумент 'arguments' позволяет нам передавать значения слушателям.
Получение нашей трансляции
Во втором контроллере нам нужно настроить код для прослушивания нашей трансляции.
Это действительно так просто. Живой пример
Другие способы достижения аналогичных результатов
Старайтесь избегать использования этого набора методов, поскольку он не эффективен и не прост в обслуживании, но это простой способ устранения проблем, которые могут возникнуть.
Обычно вы можете делать то же самое, используя сервис или упрощая свои контроллеры. Мы не будем обсуждать это подробно, но я решил упомянуть об этом для полноты.
И, наконец, имейте в виду, что действительно полезная трансляция для прослушивания - это '$ destroy', снова вы можете видеть, что $ означает, что это метод или объект, созданный кодами поставщиков. В любом случае $ destroy транслируется, когда контроллер уничтожается, вы можете послушать это, чтобы узнать, когда ваш контроллер удален.
источник
источник