【问题标题】:Angular 2 : Custom pipe breakingAngular 2:自定义管道破坏
【发布时间】:2023-04-03 20:03:01
【问题描述】:

问题陈述

自定义管道应用于两个角度表达式{{fruits}}{{fruits | sortStringPipe:'asc' }} 但它应该只应用于我在表达式中传递pipe 符号的第二个。

代码库

mypipecomponent.component.ts

import { Component, OnInit } from '@angular/core';

@Component({
  selector: 'cts-mypipecomponent',
  templateUrl: './mypipecomponent.component.html',
  styleUrls: ['./mypipecomponent.component.css']
})
export class MypipecomponentComponent implements OnInit {

  fruits = ['mango','apple','banana','papaya','kiwi']

  constructor() { }

  ngOnInit() {
  }

}

自定义管道(sort-string-pipe.pipe.ts)

import { Pipe, PipeTransform } from '@angular/core';

@Pipe({
  name: 'sortStringPipe'
})
export class SortStringPipePipe implements PipeTransform {

  transform(value: any, args?: any): any {

    if(args === 'asc'){
      return value.sort()    

    }
    if(args === 'dsc'){
      return value.sort().reverse()
    }

    return value.sort();

  }

}

mypipecomponent.component.html

Unsorted Fruits: {{fruits}}
Sorted Fruits: {{fruits  | sortStringPipe:'asc'  }}

输出

Unsorted Fruits: apple,banana,kiwi,mango,papaya Sorted Fruits: apple,banana,kiwi,mango,papaya

在输出中,我们可以看到它对两个表达式都进行了排序,但它应该只对 {{fruits | sortStringPipe:'asc' }} 进行排序。

注意:如果我在两个表达式之间传递任何 HTML 元素,例如 <hr>,<br>,那么它可以工作,但我不想在表达式之间使用这些元素。

【问题讨论】:

  • 嘿,这是一个非常有趣的错误!我建议您直接在 Angular 的 repo 上提出问题,因为它确实是一个错误。与此同时,您已经有了解决方法,在 SOF 上我们无能为力帮助您。
  • 我用 stackblitz 添加了我的答案。试试这个,让我知道。

标签: angular sorting pipe


【解决方案1】:

好吧,这可能不是最优雅的解决方案,但您可以在管道内进行深度复制。

export class SortStringPipePipe implements PipeTransform {

  transform(value: any, args?: any): any {

    let pipeArr = Object.assign([],value);

    if(args === 'asc'){
      return pipeArr.sort()    

    }
    if(args === 'dsc'){
      return pipeArr.sort().reverse()
    }

    return pipeArr.sort();

  }

}

就像@trichetriche 提到的,这是一个有趣的错误。但是由于您不热衷于在 html 上使用 br 标签,因此请尝试使用这个标签。

Demo

【讨论】:

  • +1 用于解决方法,但我仍然怀疑我在第二个表达式中使用管道而不是为什么管道应用于第一个表达式。
  • 我认为由于管道的结果被绑定到数组和角度检测这作为 2 路绑定并更改该属性的所有实例
  • 也许你是对的,但是为什么在表达式之间加上<br> 之后它的行为会有所不同。在放置 <br><hr> 之后,它不会更改该属性的所有实例。
【解决方案2】:

例子:-,

HTML 文件

<p>Unsorted Fruits: {{fruits}}</p>

<p>Sorted Fruits: {{fruits  | sortStringPipe:'asc'  }}</p>

<p>descending Fruits: {{fruits  | sortStringPipe:'dsc'}}</p>

<p>Fruits(Without Mention) : {{fruits | sortStringPipe}}</p>

管道文件:-

import { Pipe, PipeTransform } from '@angular/core';

@Pipe({
  name: 'sortStringPipe'
})
export class SortStringPipePipe implements PipeTransform {

  transform(value: any, args?: any): any {

    if(args === 'asc'){
      return value.sort()    

    }
    if(args === 'dsc'){
      return value.sort().reverse()
    }
    return value.sort();
  }
}

这是我为你制作的一个可以工作的 plunker, https://stackblitz.com/edit/angular-pk2rta

输出屏幕截图

希望对你有帮助

谢谢,

穆图库马尔

【讨论】:

  • 请仔细阅读问题。使用&lt;br&gt; 元素管道工作正常。但是,如果您删除了应用于两个表达式的两个角度表达式管道之间的&lt;br&gt;
  • 嗯,是的,我读过这个问题。由于管道仅在标签内使用,我认为。在没有标签的 html 中不被视为 html 元素。
猜你喜欢
  • 1970-01-01
  • 2016-10-02
  • 2017-10-11
  • 1970-01-01
  • 2017-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-12
相关资源
最近更新 更多