SapUI5: Использование Moment.js
Рано или поздно перед любым программистом становится задача вывода даты и времени в каком-либо формате.
Форматирование чисел и даты стандартными средствами sapUI5 мы уже разбирали тут https://nickcode.ru/sapui5/urok-9-sapui5-formatirovanie-formatter-sortirovka-i-filtratsiya.html.
Однако, стандартный функционал не всегда позволяет решить все задачи. Например, нам надо вывести сколько секунд, минут, часов назад было совершено какое-либо событие, например, заведена заявка.
Одной из лучших библиотек для решения подобного рода задач считаю Moment.js.
В данной заметке посмотрим как добавить стороннюю JS библиотеку (Moment.js) в приложение SapUI5.
Пример, который мы будем рассматривать ниже, можно импортировать в свой WebIDE отсюда https://github.com/kannade/sapui5_momentjs.
Добавим библиотеку в sapUI5 приложение
Скачаем саму библиотеку с официального сайта https://momentjs.com/.
Я скачал https://momentjs.com/downloads/moment-with-locales.js и добавил файл в папку models:
Подключить библиотеку файл можно несколькими путями.
-
- Один из вариантов — добавить библиотеку в блок sap.ui.define:
sap.ui.define([ // "momentjs/nickcode/model/moment-with-locales", "sap/ui/Device" ], function ( //momentjs, Device) { "use strict"; |
-
- Но мы сделаем более красиво и добавим библиотеку в manifest.json:
"resources": { "css": [{ "uri": "css/style.css" }], "js": [{ "uri": "model/moment-with-locales.js" }]}, |
Выведем время в приложении.
Создадим самую простую JSON модель, в которой будет содержаться только одно свойство time:
// set the device model this.setModel(models.createDeviceModel(), "device"); this.setModel(models.createNickcodeModel(), "nickcode"); |
в свойство time запишем текущую дату и время:
createNickcodeModel: function () { var mdl = { "time": new Date() }; var oModel = new JSONModel(); oModel.setData(mdl); return oModel; } |
Выведем время (свойство time) в представлении:
<text text="{path: 'nickcode>/time', formatter: 'momentjs.nickcode.model.formatter.requestTime'}" class="requestTime"> </text> |
Для поля назначим форматер (метод форматера requestTime).
При этом не забудем определить форматер в контролере:
sap.ui.define([ "sap/ui/core/mvc/Controller", "momentjs/nickcode/model/formatter"], function (Controller, formatter) { "use strict"; return Controller.extend("momentjs.nickcode.controller.Main", { formatter: formatter, |
Перейдем в форматер, где мы будем использовать библиотеку moment.js.
Выведем на экране сколько прошло с момента загрузки приложения (разница между текущем временем и временем в свойстве time модели).
Затем создадим счетчик (setTimeout), который будет каждые 60 секунд обновлять значение времени:
/* global moment:true */ /*eslint consistent-this: ["error", "oElem"]*/ sap.ui.define([ //"momentjs/nickcode/model/moment-with-locales", "sap/ui/Device" ], function ( //momentjs, Device) { "use strict"; var Formatter = { requestTime: function (sValue) { if (!sValue) { return ""; } moment.locale("ru"); //Локализация - Россия var nowDate = moment(); //Сегодня var date = moment(sValue); //Дата, которая пришла в форматер var yesterday = moment(sValue).subtract(1, "days"); //вычитаем день из пришедшей даты var oElem = this; //Запомним контекст, чтобы вызвать его в setInterval if (nowDate.format("DD.MM.YY") === date.format("DD.MM.YY")) { //Если текущий день var diffMs = nowDate.diff(date); if ((diffMs) <= (1000 * 60 * 60) && !Device.system.phone) { //Будем обновлять состояние каждые 60 секунд setInterval(function () { try { var time = moment(oElem.getModel("nickcode").getData().time); //время из модели diffMs = nowDate.diff(time); //посчитаем разницу между временем из модели и текущим временем if (diffMs < 3600000) { var diffTime = time.fromNow(); oElem.setText(diffTime); //запишем время } } catch (err) { //console.log("error"); } }, 60000); return date.fromNow(); } else { return date.format("HH:mm"); } } else if (nowDate.format("DD.MM.YY") === yesterday.format("DD.MM.YY")) { //Вчера return "Вчера"; } else { //В остальных случаях return date.format("DD MMM"); } } }; return Formatter; }, true); |
Выглядеть это будет следующим образом:
Если загрузить страницу:
Подождем минуту, значение автоматически обновится:
Подождем две минуты:
Если не выключать компьютер на ночь 🙂 :
Вот таким вот простым методом в sapUI5 можно импортировать различные сторонние js библиотеки.