А то синхронизация его раз есть!

Эта статья, как и многие другие, теперь на моем новом сайте. Этот можно найти в здесь.

Как я упоминал в своей предыдущей статье, я активно работал над приложением для сбора данных, которое будет использоваться археологами на юго-западе США. Из-за уникальных требований, предъявляемых к приложению, которое должно использоваться посреди пустыни без подключения к Интернету, я смог изучить довольно много новых альтернативных способов выполнения определенных задач.

Обзор

В этой статье я расскажу вам о создании простой формы Angular, локальном сохранении данных формы и, наконец, о том, как отправить данные после установления соединения.

Настройка формы

Прежде всего, вам понадобится проект Angular. Готовый туториал и настройку можно найти здесь. Вы можете пропустить эту начальную часть, если добавляете эту форму в существующий проект.

Примечание. При включении библиотек в свой проект убедитесь, что загружен фактический файл (например, angular.js), а не какой-либо CDN — ваше приложение должно работать в автономном режиме, и вызов CDN завершится ошибкой.

Для начала у нас будет базовый app.js, который будет содержать весь наш код Angular, и index.html, который будет содержать весь HTML-код.

Отсюда мы будем строить форму. Мы собираемся сделать простой инструмент для сбора данных о птицах. Если вы идете по лесу, изучая виды животных, вы не всегда сможете подключиться к Интернету, в зависимости от вашего местоположения.

Вы можете видеть, что я добавил data-ng-model к каждому входу. Мне нравится, когда все мои входные модели находятся в родительском объекте с именем $scope.formData для упрощения управления и отправки.

Далее мы создадим и обновим код нашего контроллера, чтобы он содержал объект formData, а также две функции:

$scope.save будет обрабатывать сохранение в локальном хранилище, а $scope.sync будет обрабатывать отправку в службу при наличии подключения к Интернету.

Для этого мы выполним следующие шаги:

  1. Заполните форму и отправьте
  2. Строковать данные формы
  3. Сохранить строку в локальном хранилище с уникальным идентификатором
  4. При подключении к Интернету проанализируйте записи localStorage обратно в JSON.
  5. Отправить данные формы

Сохранить функцию

LocalStorage хранит информацию в строковых парах ключ-значение. Каждая строка в объекте localStorage будет соответствовать отправке формы. Это упрощает синтаксический анализ позже, потому что мы просто прокручиваем каждую строку и отправляем.

Пользователи Chrome: чтобы увидеть, что находится в localStorage, откройте консоль разработчика, перейдите на вкладку «Приложение», а затем нажмите «Локальное хранилище» на левой боковой панели в разделе «Хранилище».

Сейчас он пуст и должен выглядеть примерно так:

В функции сохранения ниже происходит несколько вещей. Во-первых, мы определяем переменную stringCopy и свойство lcKey для $scope.formData. Поскольку localStorage (lc) работает только со строками, нам нужен строковый ключ и строковое значение. ключ может быть любым уникальным идентификатором — в данном случае я использую метку времени. значение — это строковая копия отправленного объекта formData.

Приятно иметь встроенную проверку при работе с JSON.parse и JSON.stringify. Если при синтаксическом анализе строкового JSON это недопустимый JSON, будет выдано исключение. Вы можете избежать этих проблем с нарушением кода, используя блок try-catch и обработав ошибку.

stringCopy = JSON.stringify($scope.formData);

Это займет объект formData ниже:

{
  beakColor: "black",
  commonName: "blue bird",
  featherColor: "blue",
  size: "small"
}

и превратить его в это:

'{"commonName":"blue bird","size":"small","beakColor":"black","featherColor":"blue"}'

Затем мы устанавливаем это в localStorage с отметкой времени в качестве ключа. Это должно выглядеть так:

Поздравляем, вы сохранили свою первую офлайн-запись. LocalStorage не имеет срока действия и будет сохраняться до тех пор, пока вы не очистите его (например, очистив файлы cookie или набрав localStorage.clear();).

Парсинг localStorage и сохранение на сервер

Сохранив еще несколько записей и вернувшись из нашего приключения по наблюдению за птицами, мы хотим синхронизировать их с базой данных и очистить наше локальное хранилище. Мы использовали JSON.stringify для помещения данных в localStorage, а теперь воспользуемся JSON.parse, чтобы вернуть их обратно.

Во-первых, нам нужно добавить вторую кнопку для обработки синхронизации локально сохраненных данных с сервером:

Затем есть встроенный объект window.navigator, который содержит свойство onLine, которое истинно, если вы подключены. В примере мы просто проверим это перед отправкой.

Если вы хотите, чтобы ваше приложение автоматически проверяло наличие соединения и автоматически синхронизировалось, вы можете поместить эту проверку в Angular $watch.

В приведенной выше функции fetchAll мы преобразовываем строковые записи localStorage в массив объектов formData. Мы вызовем эту функцию ниже, в функции submit.

Убедившись в наличии соединения, мы просматриваем все записи в массиве и отправляем их по отдельности. Мы делаем это, потому что, если одна из них выходит из строя, она все равно продолжается до следующей записи. В случае успеха он удаляется из localStorage, чтобы освободить место для новых записей формы. В случае неудачи запись останется в localStorage. Это обеспечивает постоянство данных.

Окончательные полные файлы должны выглядеть так:

Это очень простая форма, и я знаю, что она может быть довольно сложной. Я рекомендую добавить как можно больше проверки данных и визуальных предупреждений. Например, если два POST-запроса прошли успешно, а один нет, сообщите об этом пользователю с помощью простых для понимания сообщений. Они могут попытаться повторно отправить форму или двигаться дальше. Главное не потерять данные, а также знать, где хранятся ваши записи в любой момент.

Вывод

Таким образом, мы взяли базовую форму, преобразовали ее в пары ключ-значение localStorage, а затем проанализировали ее обратно в JSON и отправили в службу после обнаружения соединения.

Спасибо за внимание! Это часть серии, которую я делаю в своем приложении для сбора данных о акоме. Заходите позже, чтобы узнать больше.

Личное портфолио