2017-04-01 5 views
2

this 기사를 사용하여 angular2의 지연로드 및 공유 종속성을 학습합니다. 나는 게으른 모듈이 별도의 의존성 트리를 가지고 있고 열망하는 모듈과 같은 서비스 인스턴스를 공유하지 않는다는 것을 알았다.각도 2 지연 모듈 및 공유 모듈 싱글 톤

게으른 모듈의 가져 오기 섹션에서 SharedModule 가져 오기를 제거하면 동작이 변경되고 열망한 모듈과 지연 모듈간에 싱글 톤 서비스가 생겼습니다.

동일한 공유 서비스를 다시 사용하기위한 설명서에 따라 this 문서에 설명 된대로 더 많은 작업을 수행해야합니다. 하지만 공유 모듈 정의에서 가져 오기를 제거하는 것으로 작동하도록 만들 수 있습니다. 적어도이 아니라 당신이 설명하고있는 방법 - 사람이 동작 여기

에게 설명 할 것은 별도의 종속성 트리를 만들지 않습니다 plnkr

@NgModule({ 
    imports: [ 
    //SharedModule //This is removed 
    routing 
    ], 
    declarations: [LazyComponent] 
}) 
+0

내가 설명 할 수 있습니다. 모든 질문 목록보기 – Aravind

+0

제 질문은 다른 기사의 단계를 따르지 않았지만 제 질문이 왜 작동하는지입니다. 즉 공유 모듈을 .forRoot()로 가져 오지 않았습니다. – Sridhar

답변

6

게으른 로딩입니다.

아마 알다시피, Angular의 의존성 주입 시스템은 실제로 인젝터 트리입니다 (뷰 계층 구조의 각 구성 요소마다 하나씩). 종속성을 요청하면 Angular는이 종속성을 제공 할 수있는 첫 번째 인젝터를 찾을 때까지 의존성을 요청하는 구성 요소부터이 인젝터 트리를 탐색합니다. 구성 요소 트리의 모든 수준에서 구성 요소에 대한 종속성을 제공하고 해당 구성 요소가 해당 종속성의 자체 인스턴스를 갖게되므로 필요한 경우 많은 전력을 제공합니다. 또한 해당 구성 요소의 모든 하위 항목도 동일한 종속성 인스턴스를 공유합니다.

이것은 계층 적 종속성 주입이 구성 요소와 관련하여 어떻게 작동하는지에 대한 기본 개요입니다. 그러나 모듈에 관해서는 상황이 조금 다릅니다. 기본적으로 NgModule에서 제공하는 종속성은 루트 인젝터에 추가됩니다. 즉, 해당 종속성의 단일 인스턴스가 전체 응용 프로그램에서 공유됩니다. 예외는 NgModule이 지연로드 된 경우입니다. 이 경우 게으른로드 모듈이 제공하는 종속성이 루트 인젝터에 추가되지 않습니다. 대신, 그 종속성은 게으른로드 된 모듈의 루트 구성 요소에 추가됩니다. (나는 어려운 방법으로 이것을 배웠습니다. 게으른로드 된 모듈의 '루트 구성 요소'가 여러 개인 경우 각각의 '루트 구성 요소'는 자신의 인스턴스를 가져옵니다. 의존).

그래도 여전히 기본 계층 구조입니다. 열심히로드 된 모듈은 루트 인젝터에 의존성을 추가하는 반면 게으른로드 모듈은 모듈의 루트 구성 요소에 추가합니다. 또한 지연로드 된 모듈이 종속성 (예 : SharedModule)을 제공하는 NgModule을 가져 오는 경우 해당 종속성도 모듈의 해당 루트 구성 요소에 추가됩니다. (SharedModule이 열심히로드되는 경우, 그 종속성도 루트 인젝터에 추가되어 사용 가능한 종속성 인스턴스가 여러 개가됩니다.

마지막으로 요점은 지금보고있는 동작을 보는 이유입니다. lazy 모듈이 SharedModule을 가져올 때, SharedModules 제공 의존성은 lazy 모듈의 루트 구성 요소에 추가되어 그 종속성의 중복 인스턴스로 이어집니다.

+0

좋은 답변입니다. 그런데, 서비스가 항상 열심히 적재 된'ngModule'에 의해로드되는 경우 지연된로드 된 서비스로 가져올 이유가 없다는 점을 실용적인 관점에서 지적 할 가치가 있습니다. 반면에 주를 서비스에서 제외 시키면이 문제는 전혀 영향을 미치지 않습니다. –

+1

@AluanHaddad 서비스 상태를 유지하는 것에 대한 매우 좋은 점. 제 말은 때로는 피할 수없는 것입니다 - 서비스를 두 가지 다른 구성 요소 사이의 상태 공유 메커니즘으로 사용하고 있습니다.하지만 이는 규칙보다 더 예외입니다. – snorkpete