Проверка изменений

Оригинальное название: dirty checking

Коротко

Способ узнать, что данные изменились: фреймворк хранит прежние значения и периодически сравнивает их с текущими, а найдя разницу, обновляет интерфейс.

Что такое «Проверка изменений»

Интерфейсу нужно знать, когда перерисоваться. Если программист меняет поле обычного объекта, никто об этом не узнаёт: в JavaScript нет встроенного сигнала «поле изменилось». Dirty checking решает задачу в лоб — запоминает значения, которые использованы в шаблоне, и в нужные моменты сверяет их с прошлым снимком. Отличающиеся значения считаются «грязными», и связанные с ними части страницы обновляются.

Как это было устроено в AngularJS

Самый известный пример — первая версия Angular, AngularJS. Каждое выражение в шаблоне регистрировало наблюдателя (watcher). После клика, ответа сервера или срабатывания таймера фреймворк запускал цикл $digest: обходил всех наблюдателей и сравнивал значения. Если обработчик по ходу менял данные, цикл повторялся, пока всё не успокоится; после десяти итераций без стабилизации выбрасывалась ошибка.

// упрощённая идея одного прохода
for (const w of watchers) {
  const value = w.get();
  if (value !== w.last) {
    w.last = value;
    w.update(value);  // перерисовать связанный фрагмент
    dirty = true;
  }
}

Если изменение происходило вне механизмов фреймворка — например, в стороннем плагине jQuery, — цикл не запускался, и экран не обновлялся, пока не вызвать $scope.$apply(). Это была одна из самых частых ошибок.

Сильные и слабые стороны

Плюс подхода — простота для программиста: данные остаются обычными объектами, без обёрток. Минус — стоимость: каждое срабатывание проверяет всех наблюдателей, и на странице с большими таблицами интерфейс начинает тормозить. Для вложенных объектов приходилось выбирать между дешёвым поверхностным сравнением и дорогим глубоким.

Что используют вместо

Современный Angular тоже сравнивает значения привязок, но идёт по дереву компонентов и умеет пропускать ветви, где входные данные не менялись, а в новых версиях появились сигналы. Vue перехватывает чтение и запись свойств через Proxy и точно знает, какой компонент зависит от какого поля. Общий тренд — точечное отслеживание зависимостей вместо сплошного перебора. О том, как значения попадают в разметку, рассказано в статье про связывание данных.

Обновлено:

Все термины раздела «Frontend»

Что будем искать? Например,Продвижение