[javascript] “장식 자”란 무엇이며 어떻게 사용됩니까?

AngularJS에 데코레이터가 정확히 무엇인지 궁금합니다. 데코레이터가 AngularJS 문서애매한 내용을 저장 하고 유튜브 비디오 에 간략히 언급 한 내용은 온라인에 많은 정보가 없습니다 .

앵귤러 녀석들에 따르면 장식자는 다음과 같습니다.

서비스 데코레이션은 데코레이터가 서비스 인스턴스 생성을 가로 챌 수 있도록합니다. 반환 된 인스턴스는 원본 인스턴스이거나 원본 인스턴스에 위임 된 새 인스턴스 일 수 있습니다.

나는 그것이 무엇을 의미 하는지 잘 모르겠으며 , 왜 당신 이이 논리를 서비스 자체와 분리 시킬지 잘 모르겠습니다. 예를 들어 다른 조건에서 다른 것을 반환하려면 관련 함수에 다른 인수를 전달하거나 해당 개인 상태를 공유하는 다른 함수를 사용하십시오.

나는 여전히 일종의 AngularJS 멍청한 것이므로 내가 선택한 것은 단지 무지 및 / 또는 나쁜 습관이라고 확신합니다.



답변

좋은 사용 사례는 $provide.decorator모듈이 의존하는 일부 타사 / 업스트림 서비스에서 사소한 “조정”을 수행해야하는 경우입니다 (서비스의 소유자 / 관리자가 아니기 때문에). 다음 은 plunkr에 대한 데모입니다.


답변

데코레이터를 사용하면 교차 절단 문제를 분리하고 서비스가 “인프라”코드에 대한 걱정없이 단일 책임 원칙을 보존 할 수 있습니다.

데코레이터의 실제 사용 :

  • 캐싱 : 잠재적으로 고가의 HTTP 호출을 수행하는 서비스가있는 경우 외부 호출을 수행하기 전에 로컬 스토리지를 확인하는 캐싱 데코레이터로 서비스를 랩핑 할 수 있습니다.
  • 디버깅 / 추적 : 개발 / 생산 구성에 따라 디버깅 또는 추적 래퍼로 서비스를 장식하는 스위치가 있습니다.
  • 스로틀 링 : 자주 트리거 된 통화를 디 바운싱 래퍼로 래핑합니다. 예를 들어 요금 제한 서비스와 쉽게 상호 작용할 수 있습니다.

이 모든 경우에 서비스의 코드를 주요 책임으로 제한합니다.


답변

decorator에 의해 생성 된 서비스 인스턴스를 가로 챌 수 있으며 factory, service, value, provider, instance(service)그렇지 않으면 옵션으로 구성 할 수없는 옵션을 변경하는 옵션을 제공합니다 .

예를 들어 테스트 목적으로 모형을 제공 할 수도 있습니다 $http.


답변

간단히 말해서 확장 방법과 같다고 말할 수 있습니다. 예를 들어. 클래스가 있고 두 개의 메소드가 있으며 런타임에 메소드를 더 추가하고 Decorator를 사용하려고합니다.

읽기 전용 속성 인 heaving 상수를 변경할 수 없으므로 상수와 함께 $ provide.decorator를 사용할 수 없습니다.


답변

짧은 데코레이터는 다음과 같이 설명 할 수 있습니다.

데코레이터 기능은 서비스 생성을 가로 채서 서비스 동작을 재정의하거나 수정할 수 있습니다.

$provide각도별로 서비스를 사용하고 다른 서비스의 구현을 수정하거나 대체합니다.

$provide.decorator('service to decorate',['$delegate', function($delegate) {
  // $delegate - The original service instance, 
  //             which can be replaced, monkey patched, 
  //             configured, decorated or delegated to. 
  //             ie here what is there in the 'service to decorate'

  //   This function will be invoked, 
  //   when the service needs to be provided 
  //   and should return the decorated service instance.
  return $delegate;
}]);

예:

$provide.decorator('$log', ['$delegate', function($delegate) {
  // This will change implementation of log.war to log.error
  $delegate.warn = $delegate.error;
  return $delegate;
}]);

응용

@JBland 답변 외에도.

  • 응용 프로그램 전체 로캘 설정 :-

    여기 에서 예를 찾을 수 있습니다

  • 각도 서비스에 의한 서비스의 기본 동작 변경 및 기존 구현 :-

    여기서 예를 찾을 수 있습니다

  • 다른 환경에서 기능의 동작 전환.


답변