Статьи

Добавление автономной поддержки в мобильное приложение Kendo UI

Автор TJ VanToll для Telerik Mobile Blog.

Третий и последний выпуск Kendo UI 2014 года только что появился . Для пользователей Kendo UI Mobile есть несколько замечательных вещей — например, улучшенная поддержка AngularJS и новая тема дизайна материалов — но то, что меня радует и о чем я пишу сегодня, — это новая автономная поддержка, встроенная в Kendo UI.

Лично поддержка в автономном режиме — это одна из тех функций, которые я всегда чувствую, что должен добавить в свои приложения, но никогда не получаю, в основном потому, что это сложно, и я ленив. Но, к счастью для меня, новая офлайн-поддержка в Kendo UI делает эту функцию тривиальной для добавления. Посмотрим, как это работает.

Данные в Kendo UI Mobile

Чтобы понять, как работает автономное хранилище в Kendo UI Mobile, необходимо немного узнать о том, как работают источники данных Kendo UI . Давайте посмотрим на пример.

Предположим, вы хотите создать приложение со списком продуктов вокруг конечной точки JSON http://api.myapp.com/Groceries. Отправка GETзапросов в эту конечную точку вернет список продуктов, а отправка POSTзапросов добавит новые продукты. Источник данных Kendo UI для подключения к такой конечной точке будет выглядеть примерно так:

var groceryDataSource = new kendo.data.DataSource({
    transport: {
        read: {
            url: "http://api.myapp.com/Groceries",
            dataType: "json"
        },
        create: {
            url: "http://api.myapp.com/Groceries",
            dataType: "json"
        }
    }
});

Я оставляю настройку очень простой для этой статьи, но источник данных Kendo UI содержит множество вариантов, позволяющих подключаться к огромному количеству сервисов. Хотите настроить обработку удалений? Используйте transport.destroyопцию . Вам нужно скопировать данные из вашей устаревшей CMS для работы в вашем мобильном приложении? Вы можете использовать schemaопцию для этого. Вы можете просмотреть документы DataSource API и получить начальную документацию, чтобы получить представление о том, что возможно.

Привязка данных к виджетам

Итак, теперь, когда у вас есть источник данных, как его использовать? В Kendo UI Mobile это так же просто, как установить dataSourceпараметр для любого виджета, который поддерживает привязку DataSource. Например, предполагая, что вышеупомянутый DataSource доступен в window.groceryDataSource, вы можете создать виджет ListView, который использует этот DataSource с кодом ниже:

<ul data-role="listview" data-source="groceryDataSource" data-template="grocery-template"></ul>
<script id="grocery-template" type="text/html">
    #: Name #
</script>

Пара вещей нуждается в кратком объяснении здесь. Во-первых, обратите внимание, что data-templateатрибут в ListView соответствует idатрибуту <script>тега. Это сообщает виджету ListView, как визуализировать каждый элемент в DataSource. Приведенный выше код предполагает, что каждый продуктовый объект, полученный из серверной службы, имеет Nameсвойство. Виджет ListView заботится о создании <li>элементов и автоматическом добавлении их в список. Например, если http://api.myapp.com/Groceriesвернуть GET [{"Name": "Grapes"},{"Name":"Bread"}], вышеприведенный ListView будет содержать <li>Grapes</li><li>Bread</li>.

Заинтересованы в том, чтобы выставить объект DataSource в глобальном масштабе? Не стоит беспокоиться. Пользовательский интерфейс Kendo имеет полную инфраструктуру MVVM, которая может действовать как механизм определения объема и сохранять ссылки вне глобальной области видимости. Углубление в функциональность Kendo UI MVVM выходит за рамки этой статьи, но вы можете узнать больше об этом в наших документах .

Что хорошего в источнике данных Kendo UI, так это то, что он полностью абстрагирует вашу логику представления от базовых сервисов данных. Пользовательский интерфейс Kendo автоматически выполнит запрос GET, когда этот виджет ListView будет нуждаться в данных. Когда вам нужно добавить элементы в источник данных, вы можете использовать его add()метод . Пользовательский интерфейс Kendo автоматически обновляет представление всех виджетов, связанных с этим источником данных. Круто, да? Когда визуализированный выше виджет ListView выглядит примерно так:

e60JdJH

Понравился внешний вид этого приложения? Он использует одну из новых плоских тем Kendo UI от http://kendoflatthemes.com/ .

Добавление офлайн-функциональности

Так, где оффлайн играет в это? Предполагая, что наш тот же источник данных все еще доступен по адресу groceryDataSource, вы можете использовать следующие две строки, чтобы добавить новый элемент в список:

groceryDataSource.add({ Name: "Cheese" });
groceryDataSource.sync();

add()Метод обновляет источник данных и повторно делает виджеты; sync()метод отправляет соответствующие запросы на внутренний интерфейс. (Существует также autoSyncопция, которая устраняет необходимость явного вызова sync().)

Это прекрасно работает, за исключением одной проблемы: приложение полагается на сетевое подключение и бездействует, когда пользователь находится в автономном режиме. Если пользователь добавляет элемент в туннель, он просто исчезнет. Сюрприз! К счастью, новая автономная функциональность в Kendo UI делает эту работу довольно простой, как и ожидал пользователь. На самом деле, это всего лишь два шага.

Шаг 1: Используйте параметр offlineStorage

Первый шаг — указать offlineStorageопцию для объекта DataSource. Например, приведенный ниже код добавляет опцию в наш продуктовый источник данных.

var groceryDataSource = new kendo.data.DataSource({
    offlineStorage: "grocery-list",
    transport: {
        ...
    }
});

Пользовательский интерфейс Kendo использует API- интерфейс HTML5localStorage для хранения данных в автономном режиме по умолчанию, и этот offlineStorageпараметр используется в качестве ключа. Поэтому после добавления опции в приведенный выше код вы можете запустить, localStorage.get("grocery-list")чтобы получить необработанные данные, хранящиеся в источнике данных.

Локальное хранилище ограничено 5 МБ данных на приложение, поэтому для приложений с большим объемом данных вам может потребоваться поиск альтернативных вариантов хранения. Источник данных Kendo UI позволяет легко добавлять альтернативные методы в свои API. Проверьте объектную версию offlineStorageопции для примеров. Для получения дополнительной информации о квотах данных и работе с ними в разных браузерах, ознакомьтесь с этой прекрасной статьей на тему HTML5 Rocks .

Шаг 2: Вызовите метод online () соответствующим образом

Пользовательский интерфейс Kendo не обнаруживает для вас онлайн / офлайн доступ автоматически, потому что это может быть сложно, и то, как вы хотите справиться, зависит от того, что вы создаете. Для приложений Cordova все относительно нормально, так как плагин Cordova Network Information обнаруживает информацию о подключении устройства с помощью собственных API-интерфейсов устройства. API-интерфейс для подключения к сети — это срабатывание onlineи offlineсобытия, когда устройство подключается к сети и отключается соответственно. Поэтому реализовать автономную функциональность в нашей системе groceryDataSourceтак же просто, как добавить следующий код:

document.addEventListener("online", function() {
    groceryDataSource.online(true);
});
document.addEventListener("offline", function() {
    groceryDataSource.online(false);
});

Для тех, кто интересуется, плагин информации о сети установлен по умолчанию в новых проектах Telerik AppBuilder . Симуляторы AppBuilder также предоставляют удобный способ симуляции онлайн и оффлайн условий. Стоит проверить, если вы еще этого не сделали.

Вот как работает этот код. Когда пользователь переходит в автономный режим, offlineзапускается обработчик событий, вызывающий источник данных online(false). Это переводит DataSource в автономный режим и начинает поддерживать внутреннее __state__поле для каждого элемента данных в DataSource, для которого устанавливается либо "create", либо "update", либо "destroy".

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

Вещи немного сложнее, когда дело доходит до традиционных веб-приложений. Несмотря на то , стандартизованы onlineи offlineсобытия, как они работают, не соответствует по реализации браузера. Например, некоторые браузеры считают вас «онлайн», если вы подключены к сети, независимо от того, подключена ли эта сеть к Интернету. Для тех, кто заинтересован в добавлении автономного хранилища в традиционное веб-приложение, я бы рекомендовал прочитать документацию Kendo UI по данной проблеме . В нем рассматриваются несколько различных подходов, которые вы можете использовать в зависимости от ваших требований. Верьте или нет, периодический опрос сервера является наиболее пуленепробиваемым методом точного определения подключения.

Завершение

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

Если вы хотите узнать больше о том, что нового в выпуске Kendo UI Q3, ознакомьтесь с нашим основным видео . В нем рассказывается о новых функциях, в том числе о реализации автономных функций. Kendo UI Mobile и источник данных Kendo UI являются частью проекта Kendo UI Core с открытым исходным кодом, который можно бесплатно загрузить и использовать по адресу https://github.com/telerik/kendo-ui-core .

Изображение заголовка любезно предоставлено photosteve101