Я — начинающий front-end разработчик. Сейчас я учусь и стажируюсь в одной минской IT компании. Изучение основ web-ui проходит на примере JS библиотеки Webix. Я хочу поделиться своим скромным опытом и сохранить его в виде небольшого учебного пособия по этой интересной UI библиотеке.
ШЕСТАЯ ЗАДАЧА
Webix — это JavaScript библиотека, в которой операции в первую очередь происходят на стороне клиента, и только потом результат отправляется на сервер, если данные нужно сохранить. Каких либо строгих требований к бэкэнду здесь не предъявляется. Не важно с помощью чего обрабатываются данные на сервере, главное чтобы он принимал запросы определенного формата и отдавал ответ в нужном виде. Все что требуется от разработчика — подключать сервер и работать с простыми запросами, с учетом того, что по проекту не задуманы сложные пользовательские настройки.
Рассмотрим следующие задачи:
- подключение серверной части приложения;
- методы запросов на сервер;
- как отследить результат загрузки;
- как отследить результат сохранения.
В статье задействован виджет Table, подробно о котором написано в документации.
Исходники для работы со статьей находятся по ссылке.
С готовым приложением можно ознакомиться тут.
Подключение серверной части приложения
Приведем пример на основе виджета Table. В исходниках теперь изменена структура приложения. Раньше это был обыкновенный файл index.html с подключенными к нему js-файлами. Теперь добавлены две папки — backend, с простыми серверным скриптом на nodeJS и папка app, где лежит весь написанный клиентский код. Серверные операции для каждого виджета описаны в отдельных файлах. Для виджета Table это файл films.js.
Код виджета Table размещен в файле table.js папки app и отрисован во вкладке “Dashboard”.Для начала, запустим приложение на локальном сервере.
Откроем командную строку для папки с приложением и последовательно введем следующие команды:
npm installПосле этого в терминале появится следующая запись:
npm run server
Server is running on port 3000…Указанный адрес/ссылку открываем в браузере.
Open localhost:3000/app in browser
Серверный скрипт, к которому будет обращаться виджет Table, поддерживает все базовые crud-операции.
Для загрузки данных в таблицу указываем путь к скрипту в её свойстве url.
url: "/samples/server/films"
Для отправки запросов на сохранение — путь к скрипту указывается в свойстве save. Путь будет таким же как и в url, только с префиксом rest. О rest мы поговорим ниже.
save:"rest->/samples/server/films"
Методы запросов на сервер
Методы запросов определяют то, что мы хотим сделать с ресурсом. По умолчанию Webix использует методы GET и POST, но мы будем использовать RESTful API и все методы подходящие для наших операций с данными: GET, POST, PUT и DELETE.
С префиксом rest, который уже установлен в настройке save, все запросы будут отправляться через соответствующий готовый прокси. Прокси rest согласовывает метод запроса с типом операции, которую мы выполнили на клиенте. Под те или иные задачи есть несколько готовых прокси, при необходимости можно создавать и пользовательские прокси.
Отслеживать запросы будем на примере виджета Table. Для этого в браузере перейдем в DevTools->Network и найдем информацию о нужном запросе.
Для загрузки данных в таблицу используется метод GET.
Обновим страницу и кликнем на запрос к скрипту
films
. По умолчанию в этом запросе не будет никаких параметров, так как мы имеем дело с первой загрузкой данных в компонент.
В результате сервер нам возвращает массив JSON со всеми данными.
Результат запроса GET:
Для создания новой записи в таблице используется метод POST.
При помощи формы добавляем новые данные в таблицу.
Параметрами запроса будут следующие данные:
При добавлении записи на сервер в ответе обязательно должно прийти присвоенное там id:
{ "id":"ImurRuK1k59qzy2f" }
Это необходимо, чтобы не потерять связь между данными на сервере/клиенте. Это же id теперь будет использоваться на клиенте.
Для изменения данных в строках используется метод PUT.
Выберем в таблице первую строку — данные из нее появятся в форме. После чего изменим их и сохраним. На сервер уйдет вся запись (объект с данными) вместе с нашими изменениями.
Ответ сервера не должен содержать специфического статуса (ответом может стать и пустой объект, как будет показано ниже), но в нашем случае сервер вернёт следующий JSON:
{ status: “updated” }
Для удаления данных используется метод DELETE.
Удаляем первую строку кликом на крестик.
В этом случае передаваемыми параметрами на сервер будет вся строка. Главное в параметрах, это id записи которую предстоит удалить на сервере.
Сервер вернет пустой объект, так как специального подтверждения о такой операции не нужно.
Отслеживание результата загрузки
Рассмотрим ситуацию когда нам необходимость посчитать сколько записей было загружено в таблицу и вывести это в виде сообщения. Для этого используем обработчик ready.
Обработчик ready вызывается сразу после того, как в компоненте пришли первые данные и только один раз. Внутри обработчика поместим функцию
webix.message()
вызывающую метод count. После её вызова, в правом верхнем углу экрана появится сообщение “Loaded 250 records!”
.const table = {
// code the widget Table
ready(){
webix.message({
text:`Loaded ${this.count()} records!`,
type:"success"
});
}
}
Момент загрузки данных:
В случае, когда при загрузки данных произошла какая-либо ошибка, сработает событие onLoadError:
$$("datatable").attachEvent("onLoadError", function(xhr){
webix.message("Error!");
});
Отслеживание результата сохранения
Получить ответ сервера при сохранении можно такими операциями как добавление, редактирование и удаление. Рассмотрим на примере виджета Table.
Для этого задействован модуль DataProcessor позволяющий взаимодействовать с сервером. API этого модуля можно использовать для более точной настройки сохранения данных. Нам нужно только отследить момент сохранения — поэтому используем одно его событие — onAfterSync.
Обращение к модулю DataProcessor происходит настройкой
webix.dp(id)
Событие onAfterSync вызывается в момент, когда ответ от сервера получен и обработан. По этому событию выведем сообщение через
webix.message()
. После сохранения, в правом верхнем углу появится сообщение — “Saved!”
.Удаляем первую строку в таблице и смотрим на результат.
Код события в файле script.js после инициализации webix:
let dp = webix.dp($$("film_list"));
dp.attachEvent('onAfterSync', () => {
webix.message({
text:"Saved!",
type:"success"
})
});
Ошибки в данном случае можно отлавливать событием onAfterSaveError:
dp.attachEvent("onAfterSaveError", function(id, status, response, details){
webix.message("Error!");
});
Обобщение
При помощи операций CRUD мы разобрались как взаимодействовать с серверной частью приложения. Рассмотрели стандартный набор методов запроса и как отлавливать загрузку и сохранение данных. Рассмотренные в статье примеры доступны не только для виджета Table, но и для List. Попробовать вы это сможете самостоятельно в указанных в самом начале исходниках.
С кодом готового приложения можно ознакомиться тут.