2016-10-01 2 views
3

일부 타사 모듈을 랩핑하고 해당 서비스를 인스턴스화하고 초기화하여 응용 프로그램에서 사용할 준비가 된 하위 모듈의 서비스가 있습니다. AngularJS 실행 블록에 대한 대체 서비스 인

@Injectable() 
class SubmoduleInitializerService { 
    constructor (thirdPartyService: ThirdPartyService) { 
     thirdPartyService.initialize(...); 
     ... 
    } 
} 

@NgModule({ 
    imports: [ThirdPartyModule], 
    exports: [ThirdPartyModule], 
    providers: [ 
     ThirdPartyService, 
     SubmoduleInitializerService 
    ] 
}) 
class AppSubmodule {} 

ThirdPartyService

너무 오래 SubmoduleInitializerService으로 ThirdPartyService 또는 부모 인젝터와 같은 주사기에 주입, 직접 응용 프로그램에 주입되지 않고 다른 ThirdPartyModule 단위에서 사용되는 모든 괜찮 :

export class AppComponent { 
    constructor(
     /* DO NOT REMOVE! BAD THINGS HAPPEN! */ 
     submoduleInitializerService: SubmoduleInitializerService 
    ) {} 
    ... 
} 

SubmoduleInitializerService이 클래스 또는 템플릿에서 사용되지 않은 경우 AppComponent에 주입 된 상태를 유지해야하는 이유가 분명하지 않기 때문에 (부주의로 이미 한 번 삭제되었습니다.) 부적절한 패턴으로 입증되었습니다.

기본적으로 AppSubmodule 모듈에는 각도 1.x angular.module(...).run(...) 블록의 대안이 필요합니다.

여기에있는 옵션은 무엇입니까?

답변

5

APP_INITIALIZER (문서화되지 않음) 서비스는 AngularJS config/run 블록의 역할을 Angular 2 (비동기 초기화의 기능 제외)에서 적절하게 수행합니다. 여러 공급자가

@NgModule({ 
    imports: [ThirdPartyModule], 
    exports: [ThirdPartyModule], 
    providers: [ 
     ThirdPartyService, 
     SubmoduleInitializerService, 
     { 
      provide: APP_INITIALIZER, 
      useFactory:() =>() => {}, 
      deps: [SubmoduleInitializerService], 
      multi: true 
     } 
    ] 
}) 
class AppSubmodule {} 

APP_INITIALIZER 때문에 모듈이로드되는 순서를 따라 응용마다 여러 초기화 기능을 가질 수 : 그냥 열심히 그것이 SubmoduleInitializerService 인스턴스화 무 조작하는 초기화 블록

. 이 때문에, APP_INITIALIZER주 너무 config 블록, 몇 가지 특성,

@NgModule({ 
    imports: [ThirdPartyModule], 
    exports: [ThirdPartyModule], 
    providers: [ 
     ThirdPartyService, 
     SubmoduleInitializerService 
    ] 
}) 
class AppSubmodule { 
    constructor(sis: SubmoduleInitializerService) {} 
} 

바와 같이 this answer 설명 : 동기 초기화

는 짧은 (그리고 아마도 더 적절한) 대안은 모듈의 생성자에 서비스를 주입하는 것입니다 구성 요소를 초기화하기 전에 서비스를 구성하는 데 사용되며 경쟁 조건에 취약합니다 (예 : APP_INITIALIZERRouter을 구성하는 데 사용되므로 다른 APP_INITIALIZER에 주입하면 순환 종속성이 발생 함).