【问题标题】:How to add pipes conditionally and dynamically in Angular?如何在 Angular 中有条件地和动态地添加管道?
【发布时间】:2020-11-01 20:47:07
【问题描述】:

我有多个管道,并且想根据条件向我的输入元素添加一个或多个管道。

必须检查输入元素(this)是否具有某种样式(this.styles),并根据该样式在输入元素中添加管道。

因此,如果样式为ReverseString,则必须将管道reverseStr 添加到输入元素中。

我创建了管道,当我添加它时,管道可以正常工作(参见reverseStr):

<input type="text"
    #formItem
    [name]="id"
    [id]="id"
    class="form-control"
    [ngModel]="value | reverseStr"
    (blur)="change.emit(formItem.value)"/>

但是如何在 Angular 中有条件地添加管道?

我知道在 HTML 中添加如下内容是可能的:

[ngModel]="styles.includes('ReverseString') ? (value | SomePipe) : (value | pipe2)"

但这不是我认为最优雅的方式,如果我有多个输入组件,我每次都需要更改它

我创建了一个类似的函数:

addPipe() {
const mapping: any = {
    ReverseString: 'reverseStr',
    LowerCase: 'lowerCase',
    UpperCase: 'upperCase',
};

this.styles.forEach((style : any) => {
    const pipes = mapping[style];
    if (pipes) {
        // How can I add the pipes now dynamically? 
    }
});

}

但我不知道如何将管道动态添加到输入字段。

如何在 Angular 中有条件地动态添加管道?

【问题讨论】:

    标签: angular conditional-statements angular-pipe


    【解决方案1】:

    你可以有一个通用的管道组件,你可以在你的模板中使用参数化管道,

    所以在你的模板中有这样的东西,

    <input type="text"
        #formItem
        [name]="id"
        [id]="id"
        class="form-control"
        [ngModel]="value | customPipe:desiredStyle"
        (blur)="change.emit(formItem.value)"/>
    

    其中“customPipe”是您的管道,“desiredStyle”是您的参数(由“:”分隔),您可以处理管道内的逻辑

    请参考此stackblitz example 以更好地了解!

    【讨论】:

    • 您能否举例说明 customPipe 的外观以及如何使用所需的样式。因为输入元素 (this) 具有特定样式 (this.styles) 并且基于该样式,所以必须在输入元素中添加管道。并且样式我不是指 CSS 类或样式。
    【解决方案2】:

    要将动态Pipesinput 一起使用,您只需将ngModel 绑定到组件的settersgetters。您可以这样做:

    1. 通过 Setter 和 Getter 绑定文本输入 ngModel

    2. 检查输入的具体条件,如果计算结果为真,则使用管道

     // component.ts  
    
     private _value;
    
      get value() {
        if(this.nameInput) {
          const inputClasses = this.nameInput.nativeElement.getAttribute('class');
    
          if(inputClasses.indexOf('reverse') !== -1) {
            return (new ReverseStrPipe).transform(this._value);
          } 
        }
        return this._value;
      }
    
      set value(val) {
        this._value = val;
      }
    

    // component.html
    <input type="text"
     #nameInput
    [(ngModel)]="value"/>
    

    这是stackblitz 示例

    【讨论】:

    • 当我尝试它时,这个对我不起作用:get value() { const mapping: any = { ReverseString: new ReverseStr, LowerCase: new LowerCase, UpperCase: new UpperCase, }; this.styles.forEach((style : any) =&gt; { const directive = mapping[style]; if (directive) { return (directive).transform(this._value); } }); return this._value; } 所以我不想看 css 类,而是看范围。如果this.styles 包含给定值之一,我想为该值使用特定管道。
    • @可以修改同一个plunker并告诉我url
    • 不错。这可行,但我在页面上有多个输入字段(#nameInput),当我编辑另一个输入字段(#nameInput)时,带有“ReverseString”的输入字段的值会发生变化。以及如何从一个地方使用此功能,以免对每个输入组件重复它,而是从一个地方加载它。?
    • @Can 查看更新的插件。您在Name 字段中输入的内容将转换为UpperCase,但对于电子邮件,它将始终为LowerCase
    • 谢谢,但这不是我的意思。输入字段#nameInput 是一个组件,我多次使用它。我的意思是我更频繁地使用输入字段#nameInput。
    猜你喜欢
    • 2021-01-13
    • 1970-01-01
    • 2017-09-11
    • 2021-06-05
    • 1970-01-01
    • 2018-11-16
    • 2018-01-28
    • 1970-01-01
    • 2019-07-19
    相关资源
    最近更新 更多