【问题标题】:$cordovaBLE not defined when using ngCordova in an Ionic/Angular project在 Ionic/Angular 项目中使用 ngCordova 时未定义 $cordovaBLE
【发布时间】:2016-07-14 17:52:42
【问题描述】:

我有一个基于 Phonegap 构建的 AngularJS/Ionic 应用程序。我正在尝试将 ngCordova 与 cordova-plugin-ble-central 插件(ngCordova 中的 $cordovaBLE)一起使用。无论我尝试什么,$cordovaBLE 都是未定义的。该调用在一个服务中,该服务在一个按钮的事件处理程序中调用。

我的 index.html 包括

<script src="js/thirdparty/ionic.bundle.min.js"></script>
<script src="js/thirdparty/ng-cordova.js"></script>
<script src="cordova.js"></script>

我的应用注入是

angular.module('myapp', [
    'ionic',
    'ngCordova',
    'myapp.controller',
    'myapp.service'
]);

我的控制器定义是

angular.module('myapp.controller')

.controller('settingsCtrl', ['commServ', function (commServ) {
    var controller = this;

     // Bluetooth ------------
    controller.scan = function () {
        commServ.getDevices()
    };
}])

而我的服务定义是(myapp.service 在别处定义)

angular.module('myapp.service')

.factory('commServ', [function ($cordovaBLE) {
    // Get bluetooth devices
    service.getDevices = function () {
        console.log($cordovaBLE);

        return { error: null, success: true, value: [{ name: "Steve's Device" }] };
    };
}

控制台中的输出总是“未定义”。

【问题讨论】:

标签: javascript angularjs cordova ionic-framework ngcordova


【解决方案1】:

我猜你已经安装了插件:

cordova plugin add com.megster.cordova.ble

我注意到您的代码中有一些内容。

当您创建一个新模块时,就像您对 myapp.servicemyapp.controller 所做的那样,您必须使用这种格式:

angular.module('myapp.service', [])

注意服务模块名称后面的方括号。

您的控制器模块被称为awire.controller,但您将其注入主模块,如myapp.controller

您的服务还有另一个问题。 当您注册服务时,您始终必须将其返回,如documents

你正在返回一个对象

return { error: null, success: true, value: [{ name: "Steve's Device" }] };

但您没有实例化服务:

服务工厂函数生成单个对象或函数 表示对应用程序其余部分的服务。物体 或者服务返回的函数被注入到任何组件中 (控制器、服务、过滤器或指令)指定依赖项 在服务上。

我使用 john papa 的 style guides 中的这种模式,您的服务将如下所示:

(function() {

    'use strict';

    angular
        .module('myapp.service', [])
        .factory('commServ', commServ);

    commServ.$inject = ['$cordovaBLE'];

    /* @ngInject */
    function commServ($cordovaBLE) {

        console.log("factory => commServ => CREATE");

        var service = {
            getDevices: getDevices
        };

        return (service);

        function getDevices() {
            console.log($cordovaBLE);
            return {
                error: null,
                success: true,
                value: [{
                    name: "Steve's Device"
                }]
            };
        }
    }

})();

我已经在我的安卓设备上对其进行了测试,它可以正常工作。

【讨论】:

  • 感谢 LeftyX 的反馈。我已经添加了插件。您提供的模块创建行确实存在,只是在不同的文件中。我使用的符号是创建模块后如何在单独的文件中添加服务。 'awire' 参考是一个错字并已修复。我实际上已经发现了这个问题,但还没有机会发布解决方案。问题是我忘记添加“$cordovaBLE”注入字符串。我会将您的解决方案标记为解决方案,因为它已经在那里,尽管这种代码样式对我来说似乎过于复杂。
  • 解决方案是在服务定义中添加 $cordovaBLE 注入,例如: .factory('commServ', ['$cordovaBLE', function ($cordovaBLE) {
  • 很高兴我在某种程度上提供了帮助。风格来自约翰爸爸。一开始看起来很复杂,但是当您拥有包含大量行的模块时,它对您有很大帮助。
猜你喜欢
  • 2015-03-10
  • 1970-01-01
  • 2016-09-05
  • 1970-01-01
  • 1970-01-01
  • 2015-07-27
  • 1970-01-01
  • 2016-10-26
  • 1970-01-01
相关资源
最近更新 更多