加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

angularjs – 如何在Angular / Ionic服务中使用自定义Cordova插

发布时间:2020-12-17 16:56:43 所属栏目:安全 来源:网络整理
导读:我正在努力将自定义Cordova插件集成到Ionic应用程序中.我们有第三方创建了一个Cordova插件来与蓝牙设备连接.运行cordova平台ls显示插件已正确安装: $cordova plugin ls com.sitename.product 0.0.0 "DeviceProbe" 该插件包含一个probe.js文件,其中包含连接,
我正在努力将自定义Cordova插件集成到Ionic应用程序中.我们有第三方创建了一个Cordova插件来与蓝牙设备连接.运行cordova平台ls显示插件已正确安装:

$cordova plugin ls
> com.sitename.product 0.0.0 "DeviceProbe"

该插件包含一个probe.js文件,其中包含连接,读取,轮询和其他操作的方法.

/plugins/com.sitename.product/www/probe.js

var callNative = function(service,action,success,error,args) {
    if(args === undefined) args = [];
    cordova.exec(success,service,args);
};

var thermProbe = {

    // Methods here

};

module.exports = thermProbe;

为了在我们的控制器中使用插件,我需要创建一个Angular服务包装器,如described here.

我已经创建了一个工厂来处理这个问题.

/lib/probe/probe.js

(function() {

    'use strict';

    var serviceId = 'Probe';
    angular.module('thermProbe').factory(serviceId,['$q',Probe]);

    function Probe($q) {

        var service = {
            'connect': connect,'disconnect': disconnect,'getReading': getReading,'getName': getName,'getHigh': getHigh,'getLow': getLow,'pollReading': pollReading,'stopPolling': stopPolling,'isPolling': isPolling
        };

        return service;

        // Method wrappers

        function connect() {

            var q = $q.defer(); 

            if($window.cordova){
              cordova.plugins.thermProbe.connect(function (result) {
                q.resolve(result);
              },function (err) {
                q.reject(err);
              });
            }
            return q.promise;

        }

    }

})();

将Probe服务注入控制器工作正常.当我在我的设备上运行它(使用离子运行android)时,我收到以下错误:

TypeError: Cannot read property 'connect' of undefined

追溯到包含cordova.plugins.thermProbe.connect()的行.

我也尝试过使用cordova.plugins.probe.connect()但收到同样的错误.

如何从/plugins/com.sitename.product/www/probe.js获取方法在/lib/probe/probe.js中工作?

解决方法

经过多次试验和错误(以及console.loging)后,我能够解决这个问题.

$window对象有一个探测对象,其中包含所有需要的方法.我猜测探测器名称来自Cordova插件配置.

plugin.xml中

<js-module src="www/probe.js" name="probe">
  <clobbers target="probe" />
</js-module>
<platform name="ios">
  <config-file target="config.xml" parent="/*">
    <feature name="probe">
      <param name="ios-package" value="productName"/>
    </feature>
  </config-file>
  ...
  ...
</platform>
<platform name="android">
  <config-file target="res/xml/config.xml" parent="/*">
    <feature name="probe">
      <param name="android-package" value="com.sitename.productName"/>
      <param name="onload" value="true" />
    </feature>
  </config-file>
  ...
  ...
</platform>

要使用这些方法:

function connect() {

  var q = $q.defer(); 

  if($window.probe){
    $window.probe.connect(function (result) {
      q.resolve(result);
    },function (err) {
      q.reject(err);
    });
  }

  return q.promise;

}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读