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


148

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

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

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

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

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

답변:


219

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


6
멋진 예입니다. 실제로 타사 모듈 기능을 방해하지 않고 확장하는 방법이 궁금했습니다
Arthur Kovacs

5
데코레이터는 실제로 서비스의 모든 인스턴스를 고정 시키거나 장식하는 모듈에만 적용됩니까? 다시 말해, 모듈 B에서 서비스를 장식하는 모듈 A가 있다고 가정합니다. 그런 다음 모듈 A와 모듈 B에 의존하는 모듈 C가 있습니다. 모듈 C 내부에서 모듈 B의 서비스가 원래 버전 또는 데코레이션 된 버전입니까?
Jon Jaques

3
@ JonJaques-좋은 질문입니다. 나는 그런 상황을 겪지 않았습니다. 짐작할 수 있다면, 모듈 C가 보는 서비스의 버전은 모듈 A의 데코레이션 된 버전이어야하지만 직접 시도하기 전까지는 말할 수 없습니다. 간단한 plunkr / jsffidle을 작성하고 실험 해 보지 않겠습니까? 당신이 발견 한 것을 우리와 공유 할 수 있다면 정말 좋을 것입니다. 건배.
tamakisquare

6
@JonJaques는 - 나는 당신의 질문에 대한 답 찾을 수 내 원래 예제에 몇 줄을 추가, 그래서 내 호기심을 누르지 수 링크를 . 요컨대, 내 이전 의견의 추측이 맞습니다.
tamakisquare

17
공장, 서비스 등은 싱글 톤 (제공된대로)이므로 한 번 꾸미고 항상 꾸미십시오.
FlavorScape

66

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

데코레이터의 실제 사용 :

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

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


10

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

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



공식 Angular 문서의 참조는 다음과 같습니다. https://docs.angularjs.org/guide/decorators
David Salamon

3

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

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


1

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

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

$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 답변 외에도.

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

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

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

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

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

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