我一直认为slice
是纯净的,与在字符串或数组上调用slice
方法相比,唯一的优势是Angular中纯管道的缓存机制。
事实并非如此,slice
是不纯的。此外,实现是非常基本的:防止null
并将其委托给slice
方法。没有内部比较最后转换的输入。
我怀疑它的设计符合ngFor
的行为,但这是可行的理由吗?新人会抱怨 Angular已损坏,否则我想,但是那又为什么要使用此管道?
我是否纠正它在每次更改检测运行中都会创建新的数组,从而导致甚至触发OnPush
三种更改检测并使性能优化无效的原因?
编辑:该问题基于一种假设,即应该使用不可变数据。
答案 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);
}
}