2016-06-30 3 views
8

배럴 (https://angular.io/docs/ts/latest/glossary.html#!#barrel)에서 서비스를 가져올 때 종속성 주입 문제가 발생했습니다. 응용 프로그램의 핵심 배럴 거기에 다음의 모든 폴더에 대한 배럴, 이들은 각각의 폴더에 index.ts을함으로써 달성된다, 각 지침을 사용각도 2 - 종속성 주입 및 배킹

:

내가 직면 한 문제

이있다. 핵심 index.ts는 각 폴더의 모든 것을 참조하고 차례로 각 폴더는 특정 파일을 참조합니다.

코어 index.ts

... 
export * from './test/index'; 

테스트 index.ts

... 
export * from './my-service.service'; 

코드

import { MyService } from '../../core'; 
... 

@Injectable() 
export class AuthGuard implements CanActivate { 
    isValidSession: boolean = false; 
    errorMessage: any; 

    constructor(
     private myService: MyService 
    ) { } 

    canActivate(
     // Not using but worth knowing about 
     next: ActivatedRouteSnapshot, 
     state: RouterStateSnapshot 
    ) { 
     return this.myService.doSomething(); 
    } 
} 

상기 결과 코드 다음과 같은 오류가 :

Uncaught Cannot resolve all parameters for 'AuthGuard'(undefined). Make sure that all the parameters are decorated with Inject or have valid type annotations and that 'AuthGuard' is decorated with Injectable.

코드를 보면 내가 @Injectable 주석 누락 된 모든 문제를 찾지 못했습니다. 실제로 동일한 서비스가 다른 구성 요소에서 사용되고 핵심 index.ts를 사용하여 가져 왔습니다.

article TypeScript가 JavaScript로 변환 될 때 메타 데이터가 생성되지 않기 때문에 생성자에 @Inject이 사용되어야한다는 것을 알게되었습니다. 이것은 내 경우에 문제를 해결하지 못했습니다. 몇 가지 시도를 한 후에는 아래처럼 서비스를 가져 오기 위해 가져 오기를 변경하려고 시도했지만 오류가 발생하지 않았습니다.

성공적인 수입 :

import { MyService } from '../../core/test/my-service.service'; 

또는

import { MyService } from '../../core/test'; 

내가 거기에 문제가 내 응용 프로그램에서 index.ts 파일에 있어요 아니면 파일 구조 자체가 잘못된 것입니다 있는지 확실하지 않습니다 , 그러나 그들이 볼 수있는 것으로부터 그들은 잘 작동하고 있습니다. 이 특정 import이 다른 이유를 알고 싶습니다.

+0

가져 오기를 일반 가져 오기 문으로 변경하면 효과가 있습니까? – rinukkusu

+0

예, 질문에 추가하겠습니다. 명확하지 않다는 것을 깨닫지 못했습니다! :) –

+0

나는 배럴에있는 수출의 순서가 문제를 일으킬 수 있다고 언급 한 것 같아요. –

답변

7

정확한 문제가 있었고 Günter이 맞습니다. 배럴당 export의 순서가 중요해 보입니다. 당신이 본 같은 오류가 발생

export * from 'my.component' 
export * from 'my.service' 

: 내 배럴했다 나의 경우

. 전에 문제 해결 사용하고 구성 요소 서비스 퍼팅 : 나는 이것에 대해 어떤 문서를 찾을 수 없습니다

export * from 'my.service' 
export * from 'my.component' 

을하지만

  • 그것이 암시이기 때문에이 이상적이 문제가 확실히 덜 찾을
  • 설명되지 않았습니다.
  • 오류 메시지는 수정 방법에 대한 힌트를 제공하지 않습니다.
+0

답변 해 주셔서 감사합니다. 솔직히 나는 그렇게 많이 보지 않았다. 그러나 나는 분명히 수출 주문을 둘러보고 그 문제를 해결하는지 보려고합니다. 윌 당신이 알려 드리겠습니다 :) –

+0

오 세상에 ... ive 하루 종일이 수정 프로그램을 추적하고있다. 고맙습니다! –

1

위와 같이 주문이 중요합니다! 버그인지 아닌지는 모르지만 어쨌든 확실하지는 않습니다.

따라서 메타 데이터로 장식 된 클래스는 인덱스 맨 위에 있어야합니다. 그 중 하나가 다른 것을 삽입하면 "다른" "하나"위에 있어야합니다.