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) {} 

このようにAngularはPPipeインスタンスを作成し、そのコンストラクタに依存関係を渡します。

+0

建物は成功しましたが、私はJSコンソールの 'PPipeのためのプロバイダはありません! 'に入れました。私は' BService'にsthgを追加する必要がありますか? –

+0

あなたのパイプに '@Pipe({name:....})デコレータがあり、' declarations:[...] 'モジュールにリストされていることを確認してください。 –

+1

'モジュール、それは働いた;) –

0

別の回答が説明するように、パイプをプロバイダーとして公開することで解決できます(既定でプロバイダーではありません)。これを他のサービスとして注入します。このようにして、AServiceは角膜インジェクタによってPPipeに注入されます。

パイプtransformを手動で使用する唯一の適切なケースは、パイプが第三者であり、パイプクラス(角度付きビルトインパイプなど)でのみ使用できる便利なコードを含む場合です。

パイプがファーストパーティの場合、これを処理する適切な方法はパイプtransformを呼び出さずにを直接BServiceに使用することです。できるだけ細くなるようにパイプをリファクタリングする必要がありますが、AServiceにはパイプの機能を再利用するために必要なすべてのコードが含まれています。

関連する問題