Программное обновление в Unpoly
Unpoly предоставляет гибкий механизм обновления частей страницы без полной перезагрузки документа. При этом взаимодействие может инициироваться не только ссылками и формами, но и программным кодом. Такой подход позволяет интегрировать Unpoly в существующую архитектуру, связывать его с пользовательскими событиями, таймерами, веб-сокетами и внутренними состояниями приложения.
Базовая функция: up.render(). Она принимает селектор
целевого фрагмента и параметры обновления. По умолчанию Unpoly загрузит
новый HTML с сервера, заменит содержимое указанного слоя и выполнит
необходимые переходы и анимацию.
up.render('.content', { url: '/articles/42' })
Сервер должен вернуть частичный HTML, подходящий для замены
выбранного фрагмента. Если селектор не найден в возвращённом документе,
поведение можно настраивать с помощью опций failTarget,
fallback и других.
Unpoly работает со слоями — стеком представлений, которые ведут себя аналогично страницам и модальным окнам, но обновляются через AJAX. Программный вызов может указывать слой:
up.render({ target: '.content', layer: 'root', url: '/dashboard' })
Ключевой момент: отсутствие указания
layer подчиняется стандартной стратегии — обновление
происходит в активном слое. Также возможна работа с новым слоем
(например, модальным):
up.layer.open({ url: '/edit/42', target: '.modal-content' })
Программное обновление поддерживает те же параметры, что и атрибуты ссылок/форм:
url — путь к ресурсуmethod — HTTP-метод, по умолчанию GETparams — дополнительные данные запросаheaders — заголовкиtimeout — время ожиданияhistory — управление историей браузераscroll — поведение скроллаfocus — стратегия фокусаup.render('.list', {
url: '/items',
params: { page: 3 },
history: true,
scroll: 'preserve'
})
Важно: в отличие от ручного AJAX, Unpoly самостоятельно обрабатывает историю, фокус, отмену конкурирующих запросов и расстановку переходов.
Разметка и код могут задавать переходы (transition) для
плавной смены содержимого. При программном вызове переход задаётся
параметром:
up.render('.panel', {
url: '/panel/info',
transition: 'cross-fade'
})
Если фрагмент имеет в HTML атрибут up-transition, он
будет использован по умолчанию. Анимации учитывают слои, поддерживают
отмену и взаимное перекрытие обновлений.
Unpoly отменяет предыдущие запросы при появлении новых, если они
направлены на тот же слой. Это предотвращает состязательные состояния и
упрощает управление UI. При необходимости стратегию можно изменить
параметрами abort, queue и
abortable.
up.render('.feed', { url: '/feed?since=2000', abort: false })
Здесь обновления будут выполняться параллельно, что подходит для фоновых задач, но может привести к несогласованности отображения, если обновления влияют на одну область.
Unpoly умеет менять слой локально. Вызов up.replace()
позволяет заменить целевой фрагмент переданным HTML:
up.replace('.title', '<h1>Новое заглавие</h1>')
Поддерживается обновление атрибутов, управление фокусом и запуск хук-механизмов. Такой подход полезен при интеграции с клиентской логикой или реакцией на события WebSocket.
Unpoly поддерживает механизм fragments, позволяющий
запросить с сервера только конкретные части документа. Программный вызов
позволяет указать массив целей:
up.render({
url: '/stats',
target: ['.chart', '.summary']
})
Ответ сервера должен содержать оба фрагмента; иначе применяется стратегия восстановления (fallback), например обновление корневого слоя.
Если обновление подменяет значимую часть страницы, часто требуется
управление history. Пример:
up.render('.main', {
url: '/products?page=4',
history: true
})
Unpoly вставит новую запись в историю браузера и обеспечит корректную
работу кнопок Back/Forward. Также доступно
history: 'replace' для замены текущей записи.
Ошибки сетевого слоя или несовпадение фрагментов не приводят к аварийному падению интерфейса. Возможные стратегии:
failTarget — целевой фрагмент, который обновится при
ошибкеfallback — переход к полному обновлению слоя или
страницыonError — хук для программного перехватаup.render('.dashboard', {
url: '/dashboard',
failTarget: '.error-box'
})
Сервер может вернуть только фрагмент ошибки, а клиент покажет его согласно стратегии.
Формы можно отправлять программно:
up.submit('.edit-form')
или использовать up.render() с параметром
method: 'POST'. Это позволяет встраивать Unpoly в сложное
клиентское окружение, например, отправку по горячим клавишам или
комбинацию с кастомными контролами.
При обновлении UI по внешним данным (WebSocket, SSE, таймер) стандартная схема:
up.render() или
up.replace()params или встроить в
HTML при локальной заменеЭто позволяет синхронизировать UI без ручного управления состояниями.
Unpoly предоставляет хуки для инициализации и разрушения фрагментов:
up.compiler, up.validator,
up.destructor. Программное обновление вызывает их
автоматически, обеспечивая предсказуемый жизненный цикл элементов:
Лучшей практикой считается маленький размер частичных HTML и
фрагментов. Программное обновление позволяет загружать только конкретные
области, снижая трафик и нагрузку на сервер. Кэширование
(up.cache) может хранить ответы и переиспользовать их при
следующих вызовах up.render().
При длительных операциях можно включить индикатор запросов
(up.progress) или задать собственную стратегию. Это
помогает избежать ощущения блокировки при работе со сложными слоями и
несколькими запросами.
Программное обновление особенно эффективно в приложениях, где бизнес-логика расположена на сервере, а клиент отвечает за плавную навигацию. При этом остается возможность тонкой настройки: унификация поведения слоёв, локальные правки, смешанная стратегия обновления и работа с историей без сторонних роутеров.