1

서비스 A에서는 파이프 P를 사용해야합니다.이 파이프 P에는 서비스 B가 작동해야합니다. 나는 이런 식으로 뭔가 지금까지 무슨 짓을 :다른 서비스의 서비스에 의존하는 파이프 사용

내 P 파이프 정의

export class PPipe implements PipeTransform { 

    constructor(private aService: AService) {} 

    transform(value:number) : string { 
    return number.toString(); 
    } 
} 

내 서비스 B

@Injectable() 
export class BService { 

    pPipe = new PPipe(); 

    myFn() { 
    const nbToStr = pPipe.transform(69); 
    } 
} 

에서 사용하는 방법하지만 오류가 발생하면 건물 : Expected 1 arguments, but got 0..

PPipe를 사용할 때마다 인스턴스를 전달해야합니까? 그렇다면 HTML 템플릿에서 어떻게 할 수 있습니까?

감사합니다.

답변

2

파이프를 삽입해야합니다. new으로 무언가를 만들면 Angulars DI는 상호 작용할 방법이 없습니다.

export class BService { 
    constructor(private pPipe:PPipe) {} 

각도가 PPipe 인스턴스를 만들고 해당 생성자에 종속성을 통과 이쪽으로.

+0

건물이 성공했지만 JS 콘솔에'No piper for provider! '가 표시됩니다.'BService'에 sthg를 추가해야합니까? –

+0

파이프에'@Pipe ({name : ....}) 데코레이터가 있고'declarations : [...] 모듈에 나열되어 있는지 확인하십시오. –

+1

모듈, 작동;) –

0

다른 대답으로 설명하면 파이프를 공급자로 공개하여 해결할 수 있습니다 (기본적으로 공급자가 아닙니다). 그리고 다른 서비스처럼 주입합니다. 이 방법 AService은 Angular injector에 의해 PPipe에 주입 될 것입니다.

transform 파이프를 수동으로 사용하는 유일한 경우는 파이프가 제 3 자이며 파이프 클래스에서만 사용할 수있는 유용한 코드 (예 : 각도 내장 파이프)가 포함 된 경우입니다.

파이프가 제 1자인 경우 적절하게 처리하려면 파이프 transform을 호출하지 말고 에 AService을 직접 사용하십시오. 가능한 한 슬림형으로 파이프를 리팩토링해야하며 AService에는 파이프 기능을 재사용하는 데 필요한 모든 코드가 포함되어 있어야합니다.