Dynamic pipe in Angular 2

后端 未结 6 962
失恋的感觉
失恋的感觉 2020-12-01 12:35

I\'m trying to create a component where you can pass which pipe that should be used for a list inside the component. From what I could find by testing and looking around for

6条回答
  •  粉色の甜心
    2020-12-01 13:24

    Building on borislemke's answer, here's a solution which does not need eval() and which I find rather clean:

    dynamic.pipe.ts:

    import {
        Injector,
        Pipe,
        PipeTransform
    } from '@angular/core';
    
    
    @Pipe({
      name: 'dynamicPipe'
    })
    export class DynamicPipe implements PipeTransform {
    
        public constructor(private injector: Injector) {
        }
    
        transform(value: any, pipeToken: any, pipeArgs: any[]): any {
            if (!pipeToken) {
                return value;
            }
            else {
                let pipe = this.injector.get(pipeToken);
                return pipe.transform(value, ...pipeArgs);
            }
        }
    }
    

    app.module.ts:

    // …
    import { DynamicPipe } from './dynamic.pipe';
    
    @NgModule({
      declarations: [
        // …
        DynamicPipe,
      ],
      imports: [
        // …
      ],
      providers: [
        // list all pipes you would like to use
        PercentPipe,
        ],
      bootstrap: [AppComponent]
    })
    export class AppModule { }
    

    app.component.ts:

    import { Component, OnInit } from '@angular/core';
    import { PercentPipe } from '@angular/common';
    
    @Component({
      selector: 'app-root',
      template: `
        The following should be a percentage: 
        {{ myPercentage | dynamicPipe: myPipe:myPipeArgs }}
        `,
      providers: []
    })
    
    export class AppComponent implements OnInit {
      myPercentage = 0.5;
      myPipe = PercentPipe;
      myPipeArgs = [];
    }
    

提交回复
热议问题