Я всегда считал, что slice чист, и его единственным преимуществом перед вызовом метода slice для строки или массива является механизм кэширования чистых каналов в Angular.

Оказывается, это не так и slice нечисто. Более того, реализация очень проста: она защищает от null и делегирует метод slice. Нет внутреннего сравнения последнего преобразованного ввода.

Я подозреваю, что он разработан для согласования с поведением ngFor, но является ли это веской причиной? Новички будут жаловаться, что Angular не работает , иначе я полагаю, но опять же, зачем мне использовать этот канал?

Правильно ли я, что он создает новые массивы при каждом запуске обнаружения изменений, что приводит к срабатыванию даже OnPush обнаружения изменений по трем и сводит на нет оптимизацию производительности?

Изменить: этот вопрос основан на предположении, что следует использовать неизменяемые данные.

4
Tomasz Błachut 11 Сен 2018 в 13:23

2 ответа

Лучший ответ

Этот канал является нечистым, потому что в противном случае он возвращал бы тот же результат, пока ссылка на массив не изменится, поэтому он не будет работать при изменении элементов массива.

Я лично считаю, что использовать такие трубы - плохой дизайн. Они удалили FilterPipe из-за проблем с производительностью. Действительно, конвейер запускается при каждом обнаружении изменений, а их много! Я думаю, что трубу для резки тоже следует удалить. Для меня это быстрое и грязное решение, которое приносит больше проблем, чем решает.

Я предлагаю вам самостоятельно нарезать массивы, когда это необходимо.

5
Guerric P 12 Сен 2018 в 08:31

В дополнение к ответу Guerric P, иногда может быть удобно иметь чистый отрезок канала. К счастью, его легко создать:

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);
    }
}

1
Valeriy Katkov 22 Май 2020 в 14:48