한 가지 알아야 할 것은 $ 접두사는 Angular Method를, $$ 접두사는 사용을 피해야하는 Angular Method를 나타냅니다.
아래는 예제 템플릿과 해당 컨트롤러입니다. $ 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를 모든 자식에게 사용하는 것입니다. dom 요소가 형제이기 때문에 우리의 경우를 훨씬 쉽게 만듭니다.
$ rootScope 추가 및 $ broadcast 가능
app.controller('FirstCtrl', function($rootScope, $scope){
$scope.register = function(){
$rootScope.$broadcast('BOOM!', $scope.name)
}
});
$ rootScope를 추가했고 이제 $ broadcast (broadcastName, arguments)를 사용하고 있습니다. broadcastName의 경우 고유 한 이름을 지정하여 secondCtrl에서 해당 이름을 찾을 수 있습니다. BOOM을 선택했습니다! 재미로. 두 번째 인수 '인수'는 값을 리스너에게 전달할 수있게합니다.
방송 받기
두 번째 컨트롤러에서는 방송을 들으려면 코드를 설정해야합니다
app.controller('SecondCtrl', function($scope){
$scope.$on('BOOM!', function(events, args){
console.log(args);
$scope.name = args; //now we've registered!
})
});
정말 간단합니다. 라이브 예
비슷한 결과를 얻는 다른 방법
이 방법을 사용하는 것은 비효율적이거나 유지하기 쉽지 않지만 문제를 해결하는 간단한 방법이므로 사용하지 마십시오.
일반적으로 서비스를 사용하거나 컨트롤러를 단순화하여 동일한 작업을 수행 할 수 있습니다. 우리는 이것에 대해 자세히 논의하지는 않지만 완전성을 위해 언급하겠다고 생각했습니다.
마지막으로, '$ destroy'를 들으려면 정말 유용한 브로드 캐스트를 다시 명심하십시오. $는 벤더 코드에 의해 생성 된 메소드 또는 객체임을 의미합니다. 어쨌든 $ destroy는 컨트롤러가 파괴 될 때 브로드 캐스팅됩니다. 컨트롤러를 제거 할 때이 정보를 듣고 싶을 수 있습니다.