2017-08-29 62 views
0

我有一個實現DecimalPipe變換()方法,像這樣一個簡單的自定義管角管https://plnkr.co/edit/eEfXoXdM1OakuX1TjR1N?p=preview
顯然,這是沒有太大的定製管道,因爲它實現了DecimalPipe,但是我的最終目標是讓這個管道支持更多的模式,而不是'1.2-2'。我做了一些研究,似乎每個人都使用if/else或switch語句等控制結構。我想這會是這樣的:使用多種模式

export class MyDecimalFormatPipe implements PipeTransform { 

    constructor(public decimalPipe: DecimalPipe) {}; 

    transform(value: any) { 
     if (somevalue) { 
      let format = '1.2-2' 
      value = this.decimalPipe.transform(value, format); 
     } 
     else if (othervalue) { 
      let format = '1.4-4' 
      value = this.decimalPipe.transform(value, format); 
     } 
     ... 
     return value 
    } 
} 

這似乎是錯誤的,「笨重」在我們添加更多的格式模式這種方法會得到相當大的。我想管道應該有一些預先設定的格式模式,將根據輸入值進行設置。人們可以爲此創建一個方法也許,像這樣:

setFormatPattern(inputPattern: string): string { 
    let pattern: any; 
    this.myPatternsArray.forEach(element => { 
     if (element.format === inputPattern) { 
      pattern = element.pattern; 
     } 
    }); 
    return pattern; 
} 

我與掙扎的設計,以及這個問題的實現(代碼)。必須有一個更簡單的方法...

回答

1

您可以將參數傳遞到您的管道是這樣的:

{{ whatever | mypipe: 'option1' }} 

這將被傳遞到您的pipe.ts爲ARGS:

transform(value: any, args?: string) { 
    switch (args) { 
    case 'option1': 
     return handleOption1(value); 
    case 'option2': 
     return handleOption2(value); 
    ... 
    } 
} 
+0

在這種情況下, d只需使用DecimalPipe格式即可:{{whatever | myDecimalPipe:'1.4-4'}}等等。我正在尋找一個解決方案,其中管道本身存儲了一些格式模式。 – MadCatm2

+0

如何在使用管道時定義格式? –

+0

怎麼樣有'私人myPatterns = [{patternA:'1.4-4'},{patternB:'1.2-2},{patternC:'1.9-9}]' – MadCatm2

0

你可以使用額外的參數,通過它將格式傳遞到管道,也許你想要這樣的東西:

export class MyDecimalFormatPipe implements PipeTransform { 

    constructor(public decimalPipe: DecimalPipe) {}; 

    transform(value: any, format: string) { 
     return this.decimalPipe.transform(value, format); 
    } 
} 

// You then use your pipe like ...: 

{{ something | myDecimalPipe: '1.4-4'}}