Angular-如何将管道注入指令

狮子24

我设置了一个指令,该指令根据您作为参数传递的管道(@Input)将格式赋予输入值。我将其用于反应形式。

为此,我需要导入所有需要的管道(现在一个),并提供一个开关以使用正确的管道。

我的问题是:是否有一种方法可以从喷射器中获取任何管道,而只需知道其标记即可const pipe = injector.get(‘currency’)

这是我的指令代码:

import { Input, Renderer2, ElementRef, forwardRef, Directive, HostListener } from '@angular/core';
import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';
import { CurrencyPipe } from '@angular/common';

@Directive({
    selector: '[formatInput]',
    providers: [
        { provide: NG_VALUE_ACCESSOR, multi: true, useExisting: forwardRef(() => FormatInputDirective) },
    ],
})
export class FormatInputDirective implements ControlValueAccessor {
    private changeCallback: Function;
    private touchedCallback: Function;

    @Input() pipe: any; // { token: string, args: any[] }

    @HostListener('input', ['$event.target.value'])
    onChange(value) {
        this.changeCallback(value);
    }

    @HostListener('blur', ['$event.target'])
    onBlur(target) {
        this.touchedCallback();
    }

    constructor(private renderer: Renderer2, private currency: CurrencyPipe, private elRef: ElementRef ) {
        this.changeCallback = (_: any) => {};
        this.touchedCallback = () => {};
    }

    writeValue(value: any): void {
        this.renderer.setProperty(this.elRef.nativeElement, 'value', this.setPipedValue(value));
    }

    setPipedValue(value: any): any {
        if (!this.pipe || !value) {
            return value;
        } else {
            let pipe;

            switch (this.pipe.token) {
                case 'currency':
                    pipe = this.currency;
                    break;
            }
            return pipe.transform(value, ...this.pipe.args);
        }
    }

    registerOnChange(fn) {
        this.changeCallback = fn;
    }

    registerOnTouched(fn: any): void {
        this.touchedCallback = fn;
    }
}

预先感谢您的答复。

拉扎尔(LazarLjubenović)

与注射一样,您首先必须提供要使用的物品。在对应的中NgModule,将CurrencyPipe(以及您稍后要注入的所有其他对象)添加到的数组中providers

providers: [CurrencyPipe],

现在Injector,通过将其添加到指令的构造函数中来注入

constructor (private injector: Injector)

通过使用get方法和标记作为参数,使用它来捕获所需管道的实例在这种情况下,令牌是类本身。

const pipe = injector.get(CurrencyPipe)

现在,您有了管道的实例。您可以使用其transform方法执行转换。

this.value = pipe.transform(123456789)

您可以在StackBlitz上看到这一点

请注意,Angular没有使用字符串进行依赖项注入的概念。您可以改用令牌,但是在管道的情况下,这并不能给您提供足够的能力。

如果要将管道指定为字符串,则必须自己定义映射。

const MAP = { 'currency': CurrencyPipe, 'decimal': DecimalPipe }

现在,使用此映射来生成正确管道的实例。

const pipeName = 'currency'
const pipeClass = MAP[pipeName]
const pipe = injector.get(pipeClass)
const value = pipe.transform(input)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何将服务注入 Angular 13 中的指令

如何将窗口注入Angular 2.1.0

如何将参数传递给 angular 中的指令函数?

如何将Razor布尔变量传递给Angular指令?

如何将动态值传递给Angular指令?

如何将服务注入Angular scrollOffset函数

如何将环境配置注入不同的 Angular 模块?

如何将类注入Service [Angular 6]

如何将降级的 Angular 服务注入 AngularJS 项目?

如何将子类的指令注入组件

如何将ngStyle传递给Angular中定义为元素的指令?

如何将多个属性传递给Angular.js属性指令?

在Angular中,如何将JSON对象/数组传递给指令?

如何将非字符串值传递给Angular指令?

Angular:如何将模板ng-model放入指令进行过滤

如何将`d3js`图与Angular指令集成

如何将数据从服务传递到angular.js中的指令

如何将渲染指令的结果作为变量传递给 angular-translate

如何将类名称添加到Angular2指令

如何将组件放入 Angular 2 中指令的宿主容器中?

如何将“ repeat()” css函数与Angular ngStyle指令结合使用?

如何根据angular中的指令属性注入服务?

如何在angular指令内动态注入验证属性

如何将Angular2管道应用于动态内容?

如何将服务注入 Angular 2+ 中的自定义 .ts 文件

如何将按钮动态注入 Angular 6 应用程序?

如何将ts-mockito注入Angular 4组件测试

Angular.js如何将$ scope注入$ scope.on()的directive()中?

如何将范围内的变量注入Angular控制器?