programing

AngularJS에서 $broadcast 이벤트를 중지하려면 어떻게 해야 합니까?

telecom 2023. 3. 16. 21:08
반응형

AngularJS에서 $broadcast 이벤트를 중지하려면 어떻게 해야 합니까?

정지할 수 있는 방법이 있나요?$broadcast어떤 이벤트가 발생합니까?

에 의해 전달된 이벤트 오브젝트$broadcast이벤트에는 다음이 없습니다.stopPropagationmethod ($rootScope에 기재되어 있는 문서)그러나병합된 풀 요청은 다음을 나타냅니다.$broadcast이벤트에는stopPropagation그들을 방문했습니다.

angularJS 1.1.2 소스 코드 조각:

$emit: function(name, args) {
    // ....
    event = {
        name: name,
        targetScope: scope,
        stopPropagation: function() {
            stopPropagation = true;
        },
        preventDefault: function() {
            event.defaultPrevented = true;
        },
        defaultPrevented: false
    },
    // ....
}

$broadcast: function(name, args) {
    // ...
    event = {
        name: name,
        targetScope: target,
        preventDefault: function() {
            event.defaultPrevented = true;
        },
        defaultPrevented: false
    },
    // ...
}

보시다시피 $broadcast 이벤트 오브젝트에는 stopPropagation이 없습니다.

stopPropagation 대신 preventDefault를 사용하여 이벤트를 "이 이벤트를 처리할 필요가 없습니다"로 표시할 수 있습니다.이렇게 하면 이벤트 전파가 중지되지는 않지만 하위 범위에 "이 이벤트를 처리할 필요가 없습니다"라는 메시지가 표시됩니다.

예: http://jsfiddle.net/C8EqT/1/

브로드캐스트에는 stopPropagation 메서드가 없기 때문에 defaultProvented 속성을 사용해야 합니다.재귀 디렉티브에서는 이 방법이 의미가 있습니다.

여기 이 플런커를 보세요.플런커

$scope.$on('test', function(event) { if (!event.defaultPrevented) { event.defaultPrevented = true; console.log('Handle event here for the root node only.'); } });

이 목적을 위해 이벤트도둑을 구현했습니다.

.factory("stealEvent", [function () {

  /**
   * If event is already "default prevented", noop.
   * If event isn't "default prevented", executes callback.
   * If callback returns a truthy value or undefined,
   * stops event propagation if possible, and flags event as "default prevented".
   */
  return function (callback) {
    return function (event) {
      if (!event.defaultPrevented) {
        var stopEvent = callback.apply(null, arguments);
        if (typeof stopEvent === "undefined" || stopEvent) {
          event.stopPropagation && event.stopPropagation();
          event.preventDefault();
        }
      }
    };
  };

}]);

사용 방법:

$scope.$on("AnyEvent", stealEvent(function (event, anyOtherParameter) {
  if ($scope.keepEvent) {
    // do some stuff with anyOtherParameter
    return true; // steal event
  } else {
    return false; // let event available for other listeners
  }
}));

$scope.$on("AnyOtherEvent", stealEvent(function (event, anyOtherParameter) {
  // do some stuff with anyOtherParameter, event stolen by default
}));

언급URL : https://stackoverflow.com/questions/15420765/how-to-stop-broadcast-events-in-angularjs

반응형