Uma coisa que você deve saber é que o prefixo $ se refere a um método angular, os prefixos $$ se referem a métodos angulares que você deve evitar usar.
abaixo está um modelo de exemplo e seus controladores, exploraremos como $ broadcast / $ on pode nos ajudar a alcançar o que queremos.
<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>
Os controladores são
app.controller('FirstCtrl', function($scope){
$scope.register = function(){
}
});
app.controller('SecondCtrl', function($scope){
});
Minha pergunta para você é como você passa o nome para o segundo controlador quando um usuário clica em registrar? Você pode encontrar várias soluções, mas a que vamos usar está usando $ broadcast e $ on.
$ broadcast vs $ emitem
Qual devemos usar? $ broadcast canalizará para todos os elementos dom filhos e $ emit canalizará a direção oposta a todos os elementos dom ancestrais.
A melhor maneira de evitar decidir entre $ emit ou $ broadcast é canalizar a partir do $ rootScope e usar $ broadcast para todos os seus filhos. O que torna nosso caso muito mais fácil, já que nossos elementos dom são irmãos.
Adicionando $ rootScope e permite que $ broadcast
app.controller('FirstCtrl', function($rootScope, $scope){
$scope.register = function(){
$rootScope.$broadcast('BOOM!', $scope.name)
}
});
Observe que adicionamos $ rootScope e agora estamos usando $ broadcast (broadcastName, argumentos). Para broadcastName, queremos atribuir um nome exclusivo para que possamos pegar esse nome em nosso secondCtrl. Eu escolhi o BOOM! apenas por diversão. Os segundos argumentos 'argumentos' nos permitem passar valores para os ouvintes.
Recebendo nossa transmissão
Em nosso segundo controlador, precisamos configurar o código para ouvir nossa transmissão
app.controller('SecondCtrl', function($scope){
$scope.$on('BOOM!', function(events, args){
console.log(args);
$scope.name = args; //now we've registered!
})
});
É realmente assim tão simples. Exemplo ao vivo
Outras maneiras de obter resultados semelhantes
Tente evitar o uso desse conjunto de métodos, pois ele não é eficiente nem fácil de manter, mas é uma maneira simples de corrigir problemas que você possa ter.
Geralmente, você pode fazer o mesmo usando um serviço ou simplificando seus controladores. Não discutiremos isso em detalhes, mas pensei em mencioná-lo por completo.
Por fim, lembre-se de que uma transmissão realmente útil para ouvir é '$ destroy' novamente. Você pode ver que $ significa que é um método ou objeto criado pelos códigos do fornecedor. De qualquer forma, $ destroy é transmitido quando um controlador é destruído. Você pode ouvir isso para saber quando seu controlador é removido.