Использование плагинов 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.

Другие вопросы по тегам