2017-07-13 11 views
1

Angular4アプリケーションをプログラミングしています。私は配列と値とパイプの種類が含まれています。 (地域、言語や数)Angular2の動的パイプ

const values = [ 
    { value: 'us', pipe: 'regions'}, 
    { value: 'en', pipe: 'language'}, 
    { value: '100', pipe: 'number'}, 
..... 
]; 

と私はので、私は値を表示し、正しいパイプを適用することができngForを作りたい:(のようなもの)

<li *ngFor="let item of values"> {{item.value | item.pipe}} </li> 

私が構築しようとしましたクラス:

export class FacetConfiguration { 
    value: string; 
    pipe: Pipe; 
} 

と私はクラスにパイプのオブジェクトを挿入します。しかしそれはうまくいかなかった。

そうする方法はありますか?または別のアイデアですか?

P.S.私がそれをしている間の理由は、構成の巨大なリストを持っていることと、それぞれのパイプタイプが異なるため、ハードコード化されているのは難しいでしょう。

は私がベースに適用するためにどのようなパイプを決定する主なパイプを持つことをお勧めしたい

答えて

2

import { Pipe, PipeTransform } from '@angular/core'; 

import { IProduct } from '../products/product'; 
@Pipe({ 

    name:'productFilter' 
}) 
export class ProductFilterPipe implements PipeTransform{ 

    transform(value: IProduct[], filterBy: string): IProduct[] { 
     filterBy = filterBy ? filterBy.toLocaleLowerCase() : null; 
     return filterBy ? value.filter((product: IProduct) => 
      product.productName.toLocaleLowerCase().indexOf(filterBy) !== -1) : value; 
    } 


} 

を参照してください。ありがとうございました値:

メインパイプ:

const values = [ 
    { value: 'us', pipe: new RegionPipe}, 
    { value: 'en', pipe: new LanguagePipe}, 
    { value: '100', pipe: new NumberPipe}, 
..... 
]; 

と変換関数を中:

trasform(value): any { 
    for(let val of values) { 
     if(val.value === value) { 
      return val.pipe.transform(value); 
     } 
    } 
    return ''; 
} 

また、あなたのメインパイプにオプションとして別のパイプを渡すことができます。

@Component({ 
    selector: 'my-app', 
    template: ` 
    <div> 
     <h2>{{'some text'| main: test}}</h2> 
    </div> 
    `, 
}) 
export class App { 
    name: string; 
    test = new TestPipe; 
    constructor() { 

    } 
} 

@Pipe({name: 'main'}) 
export class MainPipe implements PipeTransform { 
    transform(value: any, p: any): any { 
    return p.transform(value); 
    } 
} 

@Pipe({name: 'test'}) 
export class TestPipe implements PipeTransform { 
    transform(value: any): any { 
    return 'test'; 
    } 
} 
+0

私はそれが好きです。これは私が探していたものです。問題は次のとおりです。メインパイプに変数としてパイプを送ることができるので、余分な見た目を追加する必要はありませんか?以下のような: trasform(値:文字列、パイプ:パイプ):任意の{pipe.transform(値);} –

+1

あなたは素晴らしいこのhttp://plnkr.co/edit/xjMKVOL1UpfTzD0OpHe3 –

+0

を見てみることができ、ありがとうございました。これは私が探しているものです。 –

-1

サンプルパイプの実装は以下のとおりであるHTML

<tr *ngFor='let product of products|productFilter:listFilter'> 
+0

これは遠く離れて私の質問からです。私は、リストをフィルタリングする方法ではなく、パイプを挿入する方法について質問していました。とにかくありがとう。 –