Вы должны знать, что префикс $ относится к угловому методу, префикс $$ относится к угловым методам, которые следует избегать.
ниже приведен пример шаблона и его контроллеров, мы рассмотрим, как $ broadcast / $ on может помочь нам достичь того, чего мы хотим.
<div ng-controller="FirstCtrl">
<input ng-model="name"/>
<button ng-click="register()">Register </button>
</div>
<div ng-controller="SecondCtrl">
Registered Name: <input ng-model="name"/>
</div>
Контроллеры
app.controller('FirstCtrl', function($scope){
$scope.register = function(){
}
});
app.controller('SecondCtrl', function($scope){
});
Мой вопрос к вам, как вы передаете имя второму контроллеру, когда пользователь нажимает на регистр? Вы можете предложить несколько решений, но одно из них, которое мы собираемся использовать, - это использование $ broadcast и $ on.
$ широковещание против $ emit
Что мы должны использовать? $ broadcast будет направлен вниз ко всем дочерним элементам dom, а $ emit направит противоположное направление ко всем элементам dom предков.
Лучший способ избежать выбора между $ emit или $ broadcast - это канал из $ rootScope и использование $ broadcast для всех его дочерних элементов. Что делает наш случай намного проще, так как наши доминантные элементы - братья и сестры.
Добавление $ rootScope и позволяет трансляцию
app.controller('FirstCtrl', function($rootScope, $scope){
$scope.register = function(){
$rootScope.$broadcast('BOOM!', $scope.name)
}
});
Обратите внимание, что мы добавили $ rootScope и теперь используем $ broadcast (broadcastName, arguments). Для broadcastName мы хотим дать ему уникальное имя, чтобы мы могли его перехватить в нашем secondCtrl. Я выбрал БУМ! просто для удовольствия. Второй аргумент 'arguments' позволяет нам передавать значения слушателям.
Получение нашей трансляции
Во втором контроллере нам нужно настроить код для прослушивания нашей трансляции.
app.controller('SecondCtrl', function($scope){
$scope.$on('BOOM!', function(events, args){
console.log(args);
$scope.name = args; //now we've registered!
})
});
Это действительно так просто. Живой пример
Другие способы достижения аналогичных результатов
Старайтесь избегать использования этого набора методов, поскольку он не эффективен и не прост в обслуживании, но это простой способ устранения проблем, которые могут возникнуть.
Обычно вы можете делать то же самое, используя сервис или упрощая свои контроллеры. Мы не будем обсуждать это подробно, но я решил упомянуть об этом для полноты.
И, наконец, имейте в виду, что действительно полезная трансляция для прослушивания - это '$ destroy', снова вы можете видеть, что $ означает, что это метод или объект, созданный кодами поставщиков. В любом случае $ destroy транслируется, когда контроллер уничтожается, вы можете послушать это, чтобы узнать, когда ваш контроллер удален.