2017-11-01 5 views
0

特定のクラスの配列を受け入れる再利用可能なComponentを作成しました。今は、このコンポーネントにパイプを渡して、その配列の各要素を必要な視覚表現に変換したいと思います。 (これは配列オブジェクトのクラスによって変わります)。HTMLテンプレートで@Inputとして渡されたPipeの使用

今このテンプレートをテンプレートで直接使用する方法がわかりません。

export class SingleCategoryFilterComponent<T> implements OnInit { 

    @Input() 
    possibleFilterValues: T[]; 
    @Input() 
    displayPipe: PipeTransform; 

    constructor() {} 

    ngOnInit() {} 

    transformValue(value: T) { 
    return this.displayPipe.transform(value); 
    } 

} 

と(部分)テンプレート

:私はそれをプログラム的にパイプを呼び出して、余分な機能を動作させるために、管理

<button mat-menu-item *ngFor="let value of possibleFilterValues"> 
    {{transformValue(value)}} 
</button> 

しかし、私は、この変換関数を作成する必要はありませんことを好むだろう、と同じような何かを行うことができる:

<button mat-menu-item *ngFor="let value of possibleFilterValues"> 
    {{value | displayPipe}} 
</button> 

しかしdisplayPipeが登録されていないとして、それは、動作するようには思えません。変数@Input displayPipeをテンプレートで使用する方法はありますか?

+0

を以下のようなものは、(あなたの質問に合わせて微調整のいくつかの並べ替えを必要とするかもしれませんが、あなたのアイデアを得ます)角度、これは不可能です。あなたができることは、このtransformValueメソッドを削除し、{{displayPipe.transform(value)}}をテンプレート内で直接使用することです。私は今あなたと同じ問題を抱えており、より良い解決策を見出すことはできませんでした。 –

+0

それでは、大きな違いはありません –

+0

transformValueメソッドを使いたくない理由がありますか? –

答えて

0

テンプレートでこれを処理するラッパーパイプを使用し、パイプのtransformメソッドの引数としてdisplayPipeパイプを渡すのはどうでしょうか。私の知る限りでは、テンプレートで

<button mat-menu-item *ngFor="let value of possibleFilterValues"> 
    {{value | wrappingPipe:displayPipe}} 
</button> 

ラッパーパイプ

@Pipe({ 
    name: 'wrappingPipe' 
}) 
export class WrappingPipe implements PipeTransform { 
    transform(value: any, displayPipe?: PipeTransform): any { 
    if(value !== undefined) { 
     return displayPipe && displayPipe.transform ? displayPipe.transform(value) : value; 
    } else { 
     return value; 
    } 
    } 
} 
関連する問題