У меня есть массив a
, содержащий 50 000+ объектов, и у меня есть канал, который принимает этот массив a
и преобразует его в некоторый вывод, который затем отображается в представлении.
Труба имеет чистое значение, так как только при изменении ссылки на массив a
она будет переоцениваться.
У меня есть метод modifyArray
, который добавляет/удаляет некоторые элементы из массива a
. По завершении я хотел бы, чтобы труба была переоценена так, чтобы представление повторно отображалось.
Из-за того, что Angular обеспечивает неизменность, единственный параметр, который у меня есть для перепрограммируемого канала, заключается в том, что метод modifyArray
возвращает копию массива a
с внесенными изменениями, так что Angular может обнаружить, что ссылка изменилась и вызывать канал, что-то вроде этого:
modifyArray(a: T[]): T[] {
a.push(b);
a.slice(c);
return [...a];
}
Однако для такого массива с 50 000 + элементами при создании копии массива происходит реальное снижение производительности.
Я бы предположил, что явное инициирование обнаружения изменений после вызова этого метода, например, путем вызова ApplicationRef.tick()
или ChangeDetectorRef.detectChanges()
, позволит Angular понять, что массив был изменен, но это не случай:
this.a = modifyArray(a);
this.applicationRef.tick();
Создание копии массива не является опцией, так как набор данных слишком велик. Создание трубы не чистое также не является опцией, поскольку преобразование трубы к входу дорого.
Есть ли у кого-нибудь идеи о том, как это можно достичь?