为什么切片不纯净的管道?

时间:2018-09-11 10:23:10

标签: angular angular-pipe

我一直认为slice是纯净的,与在字符串或数组上调用slice方法相比,唯一的优势是Angular中纯管道的缓存机制。

事实并非如此,slice是不纯的。此外,实现是非常基本的:防止null并将其委托给slice方法。没有内部比较最后转换的输入。

我怀疑它的设计符合ngFor的行为,但这是可行的理由吗?新人会抱怨 Angular已损坏,否则我想,但是那又为什么要使用此管道?

我是否纠正它在每次更改检测运行中都会创建新的数组,从而导致甚至触发OnPush三种更改检测并使性能优化无效的原因?

编辑:该问题基于一种假设,即应该使用不可变数据。

2 个答案:

答案 0 :(得分:5)

该管道是不纯净的,因为否则它将返回相同的结果,直到数组引用发生更改,因此当数组项发生更改时它将不起作用。

我个人认为使用这种管道是不好的设计。由于性能问题,他们删除了FilterPipe。实际上,在每次更改检测时都会触发管道,并且有很多!我认为切片管也应该被移除。对我来说,这是一个快速而肮脏的解决方案,带来的问题多于解决的问题。

我建议您在需要时自己对阵列进行切片。

答案 1 :(得分:0)

除了Guerric P answer之外,有时使用纯切片管可能会很方便。幸运的是,创建一个很容易:

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

@Pipe({
    name: 'pureSlice'
})
export class PureSlicePipe implements PipeTransform {
    transform(str: string, start?: number, end?: number): string;
    transform<T>(arr: readonly T[], start?: number, end?: number): T[];
    transform(obj: string | readonly unknown[], start?: number, end?: number): string | unknown[] {
        return obj.slice(start, end);
    }
}