我有一个实现DecimalPipe transform()方法的简单自定义管道,如下所示:

export class MyDecimalFormatPipe implements PipeTransform {

    constructor(public decimalPipe: DecimalPipe) {};

    transform(value: any) {
        if (value || value === 0) {
            value = this.decimalPipe.transform(value, '1.2-2');
        }
        return value;
    }
}


这是插件链接: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;
}


我正在为这个问题的设计以及实现(代码)而苦苦挣扎。一定有更简单的方法...

最佳答案

您可以像这样将参数传递给管道:

{{ whatever | mypipe: 'option1' }}


这将以args的形式传递到您的pipe.ts中:

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

10-06 00:13