#javascript #ajax #websocket
Есть простая форма, в которой много полей и данных. Сделано с AngularJS. Пользователь
может зайти и изменить данные: добавить новые поля или удалить старые.
Требование: сделать без кнопки "сохранить", то есть производить автоматическое сохранение
при изменении поля. Существует вероятность, что над формой будут работать несколько
пользователей параллельно.
Как сделать это правильно?
Сейчас, как только происходит изменение формы, то посылается post request, и данные
сохраняются. Но как тянуть данные при их изменении автоматически? Я не могу каждые
X секунд проверять, изменились ли поля. Получится слишком много запросов на сервер.
Что думаете?
Ответы
Ответ 1
Если вам нужно поддерживать старые браузеры, то придётся делать регулярные запросы к серверу, здесь особо без вариантов. Современные браузеры поддерживают веб-сокеты: постоянное полнодуплексное соединение браузера с веб-сервером. Пока соединение открыто, клиент и сервер могут посылать друг другу сообщения. Сервер может подписаться на обновление данных в базе и рассылать уведомления всем подключенным клиентам по мере необходимости. С точки зрения GUI понадобится дополнительная работа: как уведомлять пользователя, как поступать в случае конфликтов (молча перезаписывать, перезаписывать с подтверждением, предлагать "мержить" и т. п.). Уровень поддержки в принципе нормальный: http://caniuse.com/#feat=websockets (особенно если вы можете повлиять на то, что стоит у клиента).Ответ 2
Я вам могу посоветовать попробовать angular-meteor, это относительно новый фрэймворк, на одном из MeetUp'апов нам представили этот фрэймворк, буквально с 4 строчками кода был написан функционал который вам необходим(real time update). Посмотрите видео в репозиторе, там довольно все понятно объясняют.Ответ 3
Для задач bidirectional коммуникации с сервером созданна волшебная JS-библиотека Socket.IO. Она состоит из двух частей - для клиента и сервера. На низком уровне она дает удобное единобразное API и полифилы для разных протоколов передачи данных - рабртать с голыми WebSocket не всегда приятно. Но основной бонус, это возможность автоматический учет подключеных клиентов и рассылать им сообщения бродкастом. Конечно, там нет никаких велосипедов поверх стандартов, так что вы можете использовать на сервере любое решение, на любом языке программирования, а не только Socket.io. Но функционал broadcast-рассылки вам в в любом случае необходим. Ведь после каждого обновления данных, об этом должен узнать каждый клиент. Так что, если вы будете писать сервер не на node.js - ищите соответствующую библиотеку, а не просто обертку над WebSocket. Кроме обмена данными, вам понадобится стратегия разрешения конфликтов. Если поля формы короткие, то можно использовать простейшую - Last Write Wins. Если текст длинный или LWW по другим причинам не подходит - то все очень плохо. Недавно появилось относительно удобное готовое решение: CRDT. Оно реализованно в библиотеке Swarm.js.
Комментариев нет:
Отправить комментарий