Use cases/Dirty diff — отправляем только изменённые поля
Use cases · 13 反
Dirty diff — отправляем только изменённые поля
Паттерн
У формы 20 полей, пользователь изменил два. Мы хотим отправить на сервер не всю форму, а только эти два поля — это PATCH вместо PUT. Дешевле, безопаснее (не перетрём чужие изменения), чище в логах.
Какую проблему решаем
Чтобы построить patch — нужно сравнить «было» с «стало». Императивно это значит держать предыдущее состояние во внешней переменной и не забывать обновлять его. Легко получить пустой patch после программного reset или отправить лишние поля.
Операторы и зачем они нужны
startWith — задаёт baseline (исходное состояние формы), с которым сравнится первое изменение.
pairwise — отдаёт пару [предыдущее, текущее] без внешних переменных. Состояние живёт внутри потока.
map — строит объект только из тех ключей, где previous !== current.
filter — отбрасывает пустые patches, чтобы на бэкенд не уходили бессмысленные PATCH-запросы.
Подводные камни
distinctUntilChanged() без custom comparator бесполезен на формах — Angular создаёт новый объект form value на каждое изменение, ссылочное сравнение всегда вернёт false.
Для глубоко вложенных форм наивный diff по ключам работать не будет — нужен deep diff или нормализация.
После успешного save надо обновить baseline, иначе следующий diff будет считаться от старой версии.
Что в итоге получаем
Каждое осмысленное изменение формы превращается в минимальный payload для PATCH-эндпоинта. Идеально и для аудита.