Использование плагинов ngCordova без вызова их в app.js?
Мое приложение выглядит хорошо, благодаря Ionic. Здесь есть вся основная информация, и я просто добавляю излишки - электронная почта, обмен, медиа (одна из функций - метроном) и так далее.
Я не могу заставить работать плагины.
У меня был успех с предыдущим приложением Ionic, но все плагины были вызваны изнутри
.run(function($ionicPlatform) {
$ionicPlatform.ready(function() {
}
}
и действительно, плагин Statusbar, кажется, работает нормально, и он вызывается изнутри.
Я использую стартер бокового меню со встроенными вкладками между прочим.
Моя проблема, я полагаю, в том, что у меня есть три файла контроллера. main_ctrls.js - для основного приложения menu_ctrls.js - для страниц меню, таких как обратная связь и электронная почта, аналитика extras_ctrls.js - для "дополнительного" раздела с метрономом и так далее.
Я поместил ngCordova в качестве зависимости в каждом модуле и вызвал плагин из контроллера с функцией ready. Вот контроллер электронной почты.
angular.module('menu.controllers', ['ngCordova'])
.controller('FeedCtrl', function($ionicPlatform, $scope, $cordovaEmailComposer) {
$ionicPlatform.ready(function() {
$cordovaEmailComposer.isAvailable().then(function() {
// is available
alert('Email is available');
}, function () {
// not available
alert('Email is NOT available');
});
var email = {
to: 'max@mustermann.de',
cc: 'erika@mustermann.de',
bcc: ['john@doe.com', 'jane@doe.com'],
attachments: [
'file://img/logo.png',
'res://icon.png',
'base64:icon.png//iVBORw0KGgoAAAANSUhEUg...',
'file://README.pdf'
],
subject: 'Cordova Icons',
body: 'How are you? Nice greetings from Leipzig',
isHtml: true
};
$cordovaEmailComposer.open(email).then(null, function () {
alert('Email discarded.');
});
})
});
Я тестирую его на Android (Nexus 4 с Android 5.1) с проверкой Chrome и просто получаю сообщение об ошибке "Не удается прочитать свойство isAvailable из неопределенного". Излишне говорить, что предупреждения не появляются.
Это происходит со всеми плагинами, вызываемыми из контроллеров таким образом.
Что я делаю неправильно?
2 ответа
Похоже, что вы вызываете плагины до того, как устройство Cordova Ready будет запущено. В моем приложении angularjs я сделал следующее. 1. Удалил ng-app из html и выполнил загрузку вручную через скрипт. 2. Добавил файл cordova.js в зависимость. (Как последняя зависимость. После ng-cordova js) 3. Поместил файл cordova.js в ту же папку, что и файл index.html. (Нет объяснения почему. Из любого другого места просто не добавлялось. Может быть что-то конкретное, относящееся к cordova.) 4. Добавлен следующий скрипт в index.html
<script type="text/javascript" language="text/javascript">
$(document).ready(function() {
document.addEventListener("deviceready", onDeviceReady, false);
});
onDeviceReady = function() {
alert("hello!");
angular.element(document).ready(function() {
angular.bootstrap(document, ["main"]);
});
};
</script>
Здесь "main" - это мой основной модуль angularjs. Это гарантирует, что приложение будет загружено только после того, как Cordova инициирует событие готовности устройства, и все функции, связанные с Cordova, будут доступны. Конкретно для ионного я не имею никакого кода. Может быть часть, в которую можно поместить приложение ionic bootstraps вместо angular.bootstrap.
Мои предположения: вы добавили плагины в свой проект cordova с помощью команды
cordova plugin add <plugin-location>
index.html ng-cordova include - это нормально, если вы можете использовать плагины ngCrdova в app.js, я думаю, что ng-cordova плохо внедряется в зависимости от угловых зависимостей. Попробуй это:
- app.js
- controllers.js
добавление ng-cordova в проект включает в себя настройку файлов определения модуля, таких как:
app.js
angular.module('startapp', ['ionic','ngCordova','startapp.controllers'])
controllers.js
angular.module('startapp.controllers', [])
.controller('AppCtrl', function($scope,$cordovaEmailComposer) {
var email = {
to: 'max@mustermann.de',
cc: 'erika@mustermann.de',
bcc: ['john@doe.com', 'jane@doe.com'],
attachments: [
'file://img/logo.png',
'res://icon.png',
'base64:icon.png//iVBORw0KGgoAAAANSUhEUg...',
'file://README.pdf'
],
subject: 'Cordova Icons',
body: 'How are you? Nice greetings from Leipzig',
isHtml: true
};
$cordovaEmailComposer.open(email).then(null, function () {
// user cancelled email
});
})
Включайте только ngCordova в определение приложения app.js.