Добрый день всем.
Есть приложение, написанное на ионном языке и использующее Cordova. Суть приложения заключается в отображении некоторой информации с сайта.
Ничего сложного нет. Также существует зависимость от Интернета.
При наличии Интернета вывести самые свежие данные с сайта; в противном случае вам необходимо отобразить данные, «зашитые» в приложение после выпуска.
Это было мое желание.
Проблемы возникли, когда нужно было определить наличие интернета на устройстве.
Данная статья не является единственно правильным решением проблемы.
Это всего лишь моя реализация.
Более грамотного решения я не нашел.
Поэтому основная цель моего поста - показать, как проблема была реализована мной, а также можно увидеть и прочитать комментарии/пожелания/советы других людей.
Что поможет как лично мне, так и другим в решении подобных задач.
Приложение состоит из главного экрана и двух дополнительных экранов.
При изменении маршрута и загрузке страницы блок обрабатывается решать , который полностью получает данные и затем отображает страницу.
В самом начале, чтобы легко получать информацию о состоянии Интернета, я использовал обычную переменную в правда | ЛОЖЬ..
config(function($stateProvider, $urlRouterProvider) { $stateProvider.state('main', { url: '/', templateUrl : "views/main.html", controller : "MainController", resolve :{ homepageData : function (appService){ return appService.getMainData(); } .
} }); .
});
Все работало отлично.
И вот финальный аккорд – вам необходимо узнать, есть ли на устройстве Интернет или нет. Так как у меня нет опыта разработки в этом направлении, а мне нужно это сделать! Я начал гуглить.
Я нашел библиотеку ngCordova — которая реализует связь с API Cordova через знакомый angular.js. Эта информация (об Интернете) мне нужна на этапе обработки маршрутов.
Но куда бы я ни пытался вставить этот код, ничего не получалось.
Как сказали: устройство не готово.
Вот пример одной из попыток.
.
.
run(function($ionicPlatform, $rootScope, $cordovaNetwork) {
$ionicPlatform.ready(function() {
if(window.cordova && window.cordova.plugins.Keyboard) {
cordova.plugins.Keyboard.hideKeyboardAccessoryBar(true);
}
if(window.StatusBar) {
StatusBar.styleDefault();
}
//$rootScope.internetAccess = true;
$rootScope.internetAccess = $cordovaNetwork.isOnline();
});
});
И как я уже сказал: Ошибка: устройство не готово.
Опять же в гугле те решения (для работы с ngCordova), которые я нашел, были для других плагинов, либо вообще не работали.
Попытки сделать это на примере других плагинов ничего не дали.
Решением было дать приложению много обещаний.
(: И это сработало.
Пообещав золотые горы, оно (приложение) мне поверило и начало работать.
Обещания выглядели так:
В решимости: .
resolve :{ homepageData : function (appService, $cordovaNetwork){ return appService.getMainData().
then(function(data){ return data; }); }, .
} .
и функция в обслуживании angular.module('myModule').
factory('appService', function($q, $http, config_data, $injector, $ionicPlatform) { var appData = { getMain : function() { var defer = $q.defer(); $ionicPlatform.ready(function(){ var cordovaNetwork = $injector.get('$cordovaNetwork'); if(!cordovaNetwork.isOnline()){ defer.resolve($http({ method: 'GET', url: config_data.API_HOST + config_data.JSON_PREFIX + 'main.json' }).
success(function(data, status, headers, config) { return data; })); }else{ defer.resolve($http({ method: 'GET', url: 'json/' + config_data.JSON_OFFLINE_PREFIX + 'main.json' }).
success(function(data, status, headers, config) { return data; })); } }); return defer.promise; }, .
}
return appData;
});
Я уверен, что решение может быть не самое красивое и правильное, но оно работает. Хотелось бы прочитать другие мысли и мнения.
Теги: #angularjs #cordova #ionic #ngcordova #JavaScript #angular
-
Черемон Александрийский
19 Oct, 24 -
Windows Server 2016: Облака В Массы
19 Oct, 24 -
Тесты На Тавтологию: Хорошие И Плохие
19 Oct, 24 -
Использование Табличного Представления
19 Oct, 24 -
Перл Стеганография
19 Oct, 24 -
Профессиональная Электронная Почта
19 Oct, 24