BACK
Use casesDirty 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-эндпоинта. Идеально и для аудита.

script.ts // TypeScript
CONSOLE · Console Output
Нажмите на запуск, чтобы увидеть результат...