AngularJS에서 $ rootScope. $ broadcast를 사용하는 이유는 무엇입니까?


109

AngularJS $rootScope.$broadcast에 대한 몇 가지 기본 정보를 찾으려고 했지만 AngularJS 문서는별로 도움이되지 않습니다. 쉬운 말로 우리는 이것을 왜 사용합니까?

또한 John Papa의 Hot Towel 템플릿에는 다음과 같은 공통 모듈에 사용자 정의 함수가 있습니다 $broadcast.

function $broadcast() {
    return $rootScope.$broadcast.apply($rootScope, arguments);
}

나는 이것이 무엇을하고 있는지 이해하지 못했습니다. 다음은 몇 가지 기본적인 질문입니다.

1) 무엇을 $rootScope.$broadcast합니까?

2) $rootScope.$broadcast과 의 차이점은 무엇입니까 $rootScope.$broadcast.apply?




$rootScope.$broadcast.apply()특수 arguments객체를 다른 함수 에 전달하려면를 사용해야하기 때문에 사용됩니다 apply()(반대 call()). 신청시 MDN 페이지에 대한 @Blackhole의 링크 외에도에서 항목을 확인할 수 있습니다 arguments.
Scott Schupbach

답변:


97
  1. 무엇을 $rootScope.$broadcast합니까?

    $rootScope.$broadcast응용 프로그램 범위를 통해 이벤트를 보내고 있습니다. 해당 앱의 모든 하위 범위는 간단한 $scope.$on().

    직계 상위가 아닌 범위 (예 : 상위의 분기)에 도달하려는 경우 이벤트를 보내는 것이 특히 유용합니다.

    !!! 그러나 하지 말아야 할 것은 $rootScope.$on컨트롤러에서 사용 하는 것입니다. $rootScope컨트롤러가 파괴되면 해당 이벤트 리스너가 계속 존재하고 컨트롤러가 다시 생성 될 때 더 많은 이벤트 리스너를 쌓을 것입니다. (따라서 하나의 방송이 여러 번 잡힐 것입니다). $scope.$on()대신 사용 하면 리스너도 파괴됩니다.

  2. $rootScope.$broadcast& 의 차이점은 무엇입니까 $rootScope.$broadcast.apply?

    apply()특히 지시문 및 기타 JS 라이브러리로 작업 할 때 를 사용해야하는 경우가 있습니다 . 그러나 나는 그 코드베이스를 모르기 때문에 그것이 여기에 해당되는지 알 수 없습니다.


11
$rootScope.$on메모리 누수 에 대한 대단한 캐치 . 이것은 컨트롤러가 hiEventService그가 만든 것을 호출 할 가능성이 높기 때문에 허용 된 답변에도 적용됩니다 .
adamdport

어떻게 당신이 사용하는 것이 한 예입니다 $broadcast$broadcast.apply()
손님

$ rootScope. $ broadcast는 이벤트를 자식 범위의 리스너뿐만 아니라 모든 리스너에게 보냅니다. $ scope. $ broadcast는 이벤트를 하위 범위로 제한합니다.
Geert Bellemans 2017 년

157

$rootScope 기본적으로 이벤트 리스너 및 디스패처로 작동합니다.

사용 방법에 대한 질문에 답하기 위해 rootScope.$on;

$rootScope.$broadcast("hi");

$rootScope.$on("hi", function(){
    //do something
});

그러나 $rootScope모든 앱이 $ rootScope에 의존하고 어떤 구성 요소가 어떤 이벤트를 수신하는지 알 수 없기 때문에 자신의 앱의 일반 이벤트 서비스 로 사용하는 것은 좋지 않습니다.

가장 좋은 방법은 듣거나 브로드 캐스트하려는 각 사용자 지정 이벤트에 대한 서비스를 만드는 것입니다.

.service("hiEventService",function($rootScope) {
    this.broadcast = function() {$rootScope.$broadcast("hi")}
    this.listen = function(callback) {$rootScope.$on("hi",callback)}
})

4
감사합니다 @itcouldevenbeabout이 줄이 전역 $ rootScope에 이벤트를 연결하는 것과 동일한 논리를 호출하지 않습니까? function () {$ rootScope. $ broadcast ( "hi")}, 당신이 언급 한 것은 나쁜 습관입니까?
Nexus23 2014

11
서비스를 사용하여 브로드 캐스트를 만들고 특정 이벤트에 대한 리스너를 연결하면 누가 듣고 있는지 확실하지 않은 상황을 피할 수 있습니다. 이벤트 서비스가 종속성으로있는 구성 요소가 명확 해짐
CoolTapes 2014

4
$ emit와 $ broadcast의 차이점을 방금 발견 했으므로 이벤트를 $ emit하는 것이 더 낫다고 말하고 싶습니다. 그러면 이벤트가 가능한 한 가장 작은 범위 세트에서 오염됩니다 (이상적으로는 서비스가 그것은 자신의 범위,하지만 그게 가능하다고 생각하지 않습니다)?
Brondahl

3
-1. 서비스에서의 격리가 단순히 방송하는 것보다 더 나은지 모르겠습니다. 어쨌든 서비스에서 자신의 개인 범위를 더 잘 사용하십시오. 그리고 $ broadcast가 아닌 $ emit을 사용하는 것이 좋습니다. 또한 제안 된 서비스가 이벤트 인수를 지원하지 않습니다. 더 나쁜 것은 구독 취소를 지원하지 않습니다. $ rootScope에 대한 치명적인 죄.
alpha-mouse

3
탈퇴가 없기 때문에이 답변이 망가졌습니다. hiEventService.listen(callback)컨트롤러에서 호출 하면 컨트롤러가 파괴 된 후에도 리스너는 계속 존재합니다. 메모리 누수! 컨트롤러 범위에 대한 바인딩 $scope.$on("hi",callback)은 자동 정리와 함께 제공됩니다.
adamdport 2015 년

32

$ rootScope. $ broadcast 는 모든 자식 범위가 수신 할 수있는 "전역"이벤트를 발생시키는 편리한 방법입니다. $rootScope모든 하위 범위가 메시지를 수신 할 수 있으므로 메시지를 브로드 캐스트하는 데만 사용 하면됩니다.

루트 범위는 이벤트를 브로드 캐스트합니다.

$rootScope.$broadcast("myEvent");

모든 하위 범위는 이벤트를 수신 할 수 있습니다.

$scope.$on("myEvent",function () {console.log('my event occurred');} );

$ rootScope. $ broadcast를 사용하는 이유는 무엇입니까? 를 사용 $watch하여 변수 변경을 수신하고 변수 상태가 변경 될 때 함수를 실행할 수 있습니다 . 그러나 경우에 따라 범위 변수 상태의 변경에 관계없이 응용 프로그램의 다른 부분이 수신 할 수있는 이벤트를 발생시키기 만하면됩니다. 이것이 $broadcast도움 이 될 때 입니다.


19

데이터 전달 !!!

콜백 함수 를 사용하여 수신 $broadcast할을 전달할 수있는 매개 변수 를 받아들이는 사람이 아무도없는 이유가 궁금 합니다.Object$on

예:

// the object to transfert
var myObject = {
    status : 10
}

$rootScope.$broadcast('status_updated', myObject);
$scope.$on('status_updated', function(event, obj){
    console.log(obj.status); // 10
})

8

$ rootScope. $ broadcast는 무엇을합니까?

앵귤러 앱 전체의 각 리스너에게 메시지를 브로드 캐스트합니다. 이는 서로 다른 계층 적 수준 (부모, 자식 또는 형제)의 범위로 메시지를 전송하는 매우 강력한 수단입니다.

유사하게 $ rootScope. $ emit이 있고, 유일한 차이점은 전자는 $ scope. $ on에 의해 잡히고 후자는 $ rootScope. $ on에만 잡힌다는 것입니다.

예를 참조하십시오 : -http : //toddmotto.com/all-about-angulars-emit-broadcast-on-publish-subscribing/

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.