如何使用点符号来调用Cordova插件?

时间:2017-08-24 06:38:49

标签: angular cordova typescript ionic2 ionic3

我有一个项目,我正在使用Ionic2 / Cordova Plugins / Android

$ mkdir stackoverflow-question
$ cd stackoverflow-question
$ git clone https://github.com/napolev/stackoverflow-question.git .
$ npm install
$ ionic platform add android
$ ionic run android -l

此项目正常运作。它基本上是一个Hello World项目。当您单击屏幕上的按钮时,您会收到Hello, World插件返回的消息Cordova

我的问题在于17行:

https://github.com/napolev/stackoverflow-question/blob/75ecff023a250e14752762582a078d038957c89a/src/pages/home/home.ts#L17

我想用:

window.hello.greet(...)

而不是

window["hello"].greet(...)

但是当我使用:window.hello.greet(...)时,我收到错误:

Property 'hello' does not exist on type 'Window'.

如下图所示:

enter image description here

有关如何使用点表示法来使用自定义Cordova插件的任何想法吗?

[编辑1]

根据@sebaferreras对他的评论的建议,我按以下方式更改了代码并且它运行正常:

import { Component } from "@angular/core";
import { NavController } from "ionic-angular";

@Component( {
    selector: "page-home",
    templateUrl: "home.html",
})
export class HomePage {

    private window: any = window;
    private greet: string;

    constructor(
        public navCtrl: NavController,
    ) {}

    private doGreet() {
        this.window.hello.greet("World", (message) => {
            this.greet = message;
        }, () => {
            this.greet = "[ERROR]";
        });
    }
}

但我想知道:

  1. 这是一个很好的做法:private window: any = window;

  2. 我可以在上面一行中使用比any更具体的其他类型吗?

2 个答案:

答案 0 :(得分:1)

由于该错误只是因为抱怨对hello对象中的window属性一无所知而抱怨,您可以将window对象强制转换为any,如下所示:< / p>

(<any>window).hello.greet(...)

修改

如果您想避免转换为any,您可以根据Window类创建自己的类,如下所示:

export interface IGreetingService {
    greet(): void; // Here you can add any function signature
}

export class CustomWindow extends Window {
    hello: IGreetingService;
}

然后你可以像这样使用它:

(<any>CustomWindow).hello.greet(...)

或者

private window: CustomWindow = window; // The cast is being done here!
this.window.hello.greet(...)

答案 1 :(得分:0)

通常你在Ionic / Cordova中使用自定义插件,如下所示: 在文件顶部添加以下行:

declare var NameOfTheJsModule

您可以在名称属性下的插件的plugin.xml中找到js-module的名称:

<js-module src="www/inappbrowser.js" name="inappbrowser">
  ...
</js-module>

所以在这种情况下:

delcare var inappbrowser;

并使用它,例如:

this.inappbrowser.show();