Статьи

Создайте конвертер валют с помощью jQuery Mobile и Cordova: JavaScript и пользовательские настройки

Во второй части серии я показал вам код двух HTML-страниц и пользовательский CSS-файл нашего приложения «Конвертер валют». В этой статье я покажу вам пользовательскую конфигурацию jQuery Mobile и некоторые файлы JavaScript, которые реализуют бизнес-логику. При описании файлов JavaScript я также подробно продемонстрирую API-интерфейсы Cordova.

Пользовательская конфигурация jQuery Mobile

jQuery Mobile имеет конфигурацию по умолчанию, которая обычно подходит для большинства проектов с базовыми требованиями. Тем не менее, вам все равно может потребоваться настроить некоторые специальные пользовательские правила в соответствии с требованиями вашего приложения. Как я уже говорил в первой части этой серии, когда я представлял список файлов, составляющих наше приложение, у нас есть файл с именем jquery.mobile.config.js , в котором мы точно указываем конфигурацию. В этом разделе я покажу вам, какие параметры я буду менять.

(Обратите внимание, что когда вы создаете такой файл, вы должны включить его перед mobileinit файлами библиотеки. Фактически, когда запускается jQuery Mobile, он запускает событие, называемое mobileinit , которое используется для переопределения настроек по умолчанию.)

У вас есть два разных способа задания параметров, но я буду использовать метод, который изменяет свойства объекта $.mobile . Я изменю только некоторые из них, но если вам нужен обзор всех свойств jQuery Mobile, вы можете прочитать документацию по настройке jQuery Mobile . Наш файл изменит параметры, касающиеся виджета загрузчика страниц, темы и тех, которые разрешают междоменные запросы. Настройки, разрешающие междоменные запросы, являются наиболее интересными и заслуживают обсуждения.

Как вы узнали из требований к приложению, «Конвертер валют» позвонит в RSS-канал Европейского центрального банка, чтобы обновить курсы валют, поэтому мы должны иметь возможность отправлять HTTP-запросы к внешнему источнику. Когда вы используете инфраструктуру Cordova в сочетании с jQuery Mobile, чтобы иметь возможность делать междоменные запросы, вам нужно установить одно свойство в файле config.xml для первой платформы (Cordova) и два свойства для второй (jQuery Mobile). ).

Свойства jQuery Mobile для изменения: $.support.cors и $.mobile.allowCrossDomainPages . Первым является логическое значение, которое необходимо установить в значение true , чтобы сообщить браузеру о поддержке междоменных запросов. В проекте также есть ссылки на внешние страницы (на странице кредитов), поэтому мы также должны установить для свойства $.mobile.allowCrossDomainPages значение true . Фактически, когда jQuery Mobile пытается загрузить внешнюю страницу, запрос выполняется с помощью $.mobile.loadPage() , который разрешает междоменные запросы, только если для указанного свойства установлено значение true . По умолчанию его значение равно false , потому что, согласно документации, инфраструктура отслеживает, какая страница просматривается в хеше местоположения браузера, поэтому возможна атака с использованием межсайтовых сценариев (XSS), если код XSS в Вопрос может манипулировать хешем и устанавливать его на междоменный URL по своему выбору . Эта опция должна быть установлена ​​до того, как будут сделаны запросы, и документация предлагает ввести ее в первоначальную конфигурацию. Мы будем действовать соответственно.

Теперь, когда вы знаете значение этих параметров, вы готовы увидеть полный исходный код jquery.mobile.config.js .

 $(document).on( 'mobileinit', function() { // Page Loader Widget $.mobile.loader.prototype.options.text = 'Loading...'; $.mobile.loader.prototype.options.textVisible = true; // Bypass Access-Control-Allow-Origin $.support.cors = true; $.mobile.allowCrossDomainPages = true; // Theme $.mobile.page.prototype.options.theme = 'b'; $.mobile.page.prototype.options.headerTheme = 'b'; $.mobile.page.prototype.options.contentTheme = 'b'; $.mobile.page.prototype.options.footerTheme = 'b'; $.mobile.page.prototype.options.backBtnTheme = 'b'; } ); 

Класс перевода

Вспоминая требования проекта, вы помните, что «Конвертер валют» — это мультиязычное приложение. Поскольку его наиболее важной частью является index.html , я буду создавать переводы для этой страницы и игнорировать переводы для aurelio.html . Я думаю, что наличие кредитов только на английском языке является адекватным.

Для хранения строк разных языков в файле translation.js я использовал объект, вызывающий переменную Translation . Этот объект имеет столько свойств, сколько разговорных языков вы хотите поддерживать. Итак, поскольку мы переведем его на итальянский, французский и испанский языки, у нас будет три свойства, значения которых являются объектами, содержащими строки. Чтобы упростить процесс перевода, эти объекты имеют идентификатор элементов, которые будут переведены как имена их свойств, и строку, которую нужно изменить как их значения. Чтобы понять, как осуществляется Translation , достаточно увидеть один язык, поэтому я покажу вам только итальянский, но вы обнаружите, что другие будут поддерживаться в репозитории приложения.

 var Translation = { 'it': { 'app-description': 'Currency Converter è una semplice applicazione che ti aiuta a convertire da una valuta ad un'altra. È anche possibile aggiornare i tassi di cambio ogni volta che si desidera così da avere sempre dei tassi di conversione aggiornati.', 'convert-title': 'Converti', 'from-value-label': 'Valore:', 'from-type-label': 'Da Valuta:', 'to-type-label': 'A Valuta:', 'result-title': 'Risultato', 'copyright-title': 'Creata da Aurelio De Rosa', 'credits-button': 'Crediti', 'update-button': 'Aggiorna dati', 'submit-button': 'Converti', 'reset-button': 'Azzera dati', 'last-update-label': 'Ultimo aggiornamento cambi:' } // other languages here } 

Настройки пользователя

Во вступительной статье этой серии я заявил:

Приложение сохранит последнюю валюту, использованную для конвертации, поэтому при следующем запуске приложения пользователь найдет свою последнюю использованную валюту. Кроме того, будут также сохраняться дата и время последнего обновления, чтобы пользователь знал, насколько недавними (или старыми) являются его коэффициенты конверсии.

Таким образом, нам нужно управлять и хранить эти данные. Для достижения этой цели мы будем использовать API хранилища Cordova , который построен на основе API хранилища Web и Cordova. Для устройств, которые имеют встроенную поддержку, он использует собственную реализацию вместо своей собственной, которая совместима со спецификациями W3C.

В этом разделе я собираюсь описать файл с именем settings.js который содержит класс с именем Settings . Давайте внимательнее посмотрим на этот файл.

Как вы уже знаете, этот класс имеет три открытых свойства: lastUpdate , fromCurrency и toCurrency . У этого также есть два частных: _db и _tableName . Цель первых трех свойств должна быть самоочевидной, поэтому я пропущу их объяснение. _db — это ссылка на свойство window.localStorage которое будет использоваться для вызова метода API веб-хранилища для сохранения и извлечения данных из браузера (или, в случае нашего гибридного приложения, с устройства). Имейте в виду, что этот API не использует реальные таблицы, как СУБД. Вместо этого он имеет набор свойств, значениями которых являются базовый тип (например, строка или число) или объект в кодировке JSON. Сказав это, должно быть ясно, что _tableName — это не свойство, имеющее в качестве значения строку, содержащую имя реальной таблицы, а скорее имя свойства, в котором мы будем хранить JSON-кодированный объект, содержащий пользовательские настройки. ,

Следующий код показывает, что я объяснил до сих пор.

 function Settings(lastUpdate, fromCurrency, toCurrency) { var _db = window.localStorage; var _tableName = 'settings'; this.lastUpdate = lastUpdate; this.fromCurrency = fromCurrency; this.toCurrency = toCurrency; } 

Теперь нам нужно два метода: один для хранения данных и один для их извлечения. В другой из моих удивительно творческих моментов я назвал эти методы save() и load() соответственно. Эти методы ничего не делают, кроме как оборачивают вызовы методов getItem() и setItem() , как вы можете видеть, посмотрев на их код ниже.

 this.save = function() { _db.setItem(_tableName, JSON.stringify(this)); } this.load = function() { return JSON.parse(_db.getItem(_tableName)); } 

Некоторые из вас, кто уже использовал API веб-хранилища, могут удивиться, почему я использовал setItem() и getItem() вместо использования точечной нотации. Причина в том, что Windows Phone 7 не поддерживает последнее, поэтому для обеспечения совместимости во всех операционных системах мы должны использовать первое.

У этого класса есть другой метод для обсуждения, который больше полезен, чем обязательный метод. Это называется getSettings() и это статический метод. Когда вы используете load() , извлеченный объект является не экземпляром класса Settings а эквивалентом Object . Теперь предположим, что вы хотите изменить настройки текущего пользователя на основе тех, которые вы сохранили. В этом случае намного проще иметь экземпляр Settings , так что вы можете изменить свойства и затем вызвать метод save() напрямую. По этой причине я создал getSettings() , который вызывает load() а затем преобразует результат в экземпляр Settings . Источник этой утилиты следующий:

 Settings.getSettings = function() { var settings = new Settings().load(); return (settings === null) ? {} : new Settings( settings.lastUpdate, settings.fromCurrency, settings.toCurrency ); } 

Вывод

В этой третьей статье я описал пользовательскую конфигурацию «Конвертера валют» и важность опций, разрешающих междоменные запросы. Кроме того, я показал класс, используемый для перевода приложения, и класс, используемый для сохранения пользовательских настроек. В следующей части серии я проиллюстрирую два других оставшихся файла JavaScript: functions.js (который имеет функции для получения курсов, обновления полей выбора валют и инициализации приложения) и currency.js , файл, который содержит класс для хранения, загрузки, сортировки и конвертации найденных валют.