Использование плагинов ngCordova без вызова их в app.js?

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

У меня не работают никакие плагины.

У меня был успех с предыдущим приложением Ionic, но все плагины вызывались изнутри

.run(function($ionicPlatform) {
   $ionicPlatform.ready(function() {
   }
}

и действительно, плагин Statusbar работает нормально, и он вызывается оттуда.

Я использую стартер бокового меню со встроенными вкладками, кстати.

Моя проблема, я полагаю, в том, что у меня есть три файла контроллера. main_ctrls.js — для основного приложения menu_ctrls.js — для страниц меню, таких как обратная связь и электронная почта, Analytics extras_ctrls.js — для «дополнительного» раздела с метрономом и так далее.

Я поставил «ngCordova» в качестве зависимости в каждый модуль и вызвал плагин из контроллера с готовой функцией. Вот электронный контроллер.

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: '[email protected]',
      cc: '[email protected]',
      bcc: ['[email protected]', '[email protected]'],
      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 из неопределенного». Излишне говорить, что предупреждения не появляются.

Это происходит со всеми плагинами, вызываемыми из контроллеров таким образом.

Что я делаю не так?


person Subjective Effect    schedule 29.04.2015    source источник
comment
Может быть, это поможет. raymondcamden.com/2014/08/16/   -  person paje007    schedule 29.04.2015
comment
Я мог бы попробовать это, но это кажется ненужным, так как плагины не должны быть готовы, как только приложение запускается.   -  person Subjective Effect    schedule 29.04.2015


Ответы (2)


Похоже, вы вызываете плагины до того, как устройство Cordova готово к запуску. В моем приложении angularjs я сделал следующее. 1. Удалил ng-app из html и сделал ручную загрузку через скрипт 2. Добавил в зависимость файл cordova.js. (Как последняя зависимость. После ng-cordova js) 3. Поместил cordova.js в ту же папку, что и index.html. (Без объяснений, почему. Из любого другого места он просто не добавлялся. Может быть что-то конкретное, относящееся к кордове.) 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>

Здесь «основной» — мой основной модуль angularjs. Это гарантирует, что приложение загружается только после того, как Cordova запустит событие готовности устройства, и все функции, связанные с Cordova, будут доступны. Конкретно для ionic у меня нет никакого кода. Возможно, вместо angular.bootstrap можно использовать часть, в которой ionic bootstrap выполняет загрузку приложения.

Мои предположения: вы добавили плагины в свой проект Cordova с помощью команды

cordova plugin add <plugin-location>
person paje007    schedule 29.04.2015
comment
Да, я добавил плагины в командной строке и проверил, установлены ли они. На самом деле я делаю готовое устройство, просто Ionic, а не (document).ready. Это согласно документам на ngCordova. - person Subjective Effect; 29.04.2015
comment
А как насчет файла cordova.js? Вы добавили его? Где-то будет добавлено событие deviceready. Вы должны проверить, если он уволен. - person paje007; 29.04.2015
comment
Да, добавлено. Ничего из этого без него, и это почти работает. - person Subjective Effect; 29.04.2015
comment
Можете ли вы попробовать обернуть его в document.addEventListener('deviceready', function () {}); - person paje007; 29.04.2015
comment
Я поставил предупреждение в функцию готовности, и оно срабатывает, когда вы переходите на страницу, но плагин просто не работает :( - person Subjective Effect; 29.04.2015
comment
Извините, что разбил ваш пузырь. Плагины будут работать только на реальном устройстве. Да, вы можете вручную загрузить приложение. Но все же... Плагины будут работать только на устройстве, а не на хроме. - person Karan Kumar; 29.04.2015
comment
ой... я не знаю насчет хрома... но для меня плагины очень хорошо работают на эмуляторе андроида... - person paje007; 30.04.2015

index.html ng-cordova include в порядке, если вы можете использовать плагины ngCrdova в app.js, я думаю, что ng-cordova плохо внедряется в угловые зависимости. Попробуй это:

  • app.js
  • контроллеры.js

добавление ng-cordova в проект включает в себя настройку файлов определения модуля, таких как:

app.js

angular.module('startapp', ['ionic','ngCordova','startapp.controllers'])

контроллеры.js

  angular.module('startapp.controllers', [])

    .controller('AppCtrl', function($scope,$cordovaEmailComposer) {

       var email = {
    to: '[email protected]',
    cc: '[email protected]',
    bcc: ['[email protected]', '[email protected]'],
    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.

person r0b3rt0    schedule 06.02.2016