我正在尝试使用Amplitude SDK从Ionic 3应用程序获取统计信息。但是,由于该应用程序是使用具有特定文件体系结构的TypeScript编写的,因此它并不像official documentation中那样简单。

但是,我找到了the @types/amplitude-js package,并认为它将解决所有问题。但是不幸的是,当我使用ionic cordova run android --device在设备上编译应用程序时,该应用程序无法加载,并且出现以下错误消息:

Uncaught Error: Encountered undefined provider!
Usually this means you have a circular dependencies (might be caused by using 'barrel' index.ts files.


javascript - 无法在Ionic 3应用程序中导入Amplitude SDK-LMLPHP

注意:我运行ionic serve时也会出现此错误。

这是我所做的逐步操作:


我通过运行npm install --save @types/amplitude-js安装了@ types / amplitude-js。
我通过运行npm install amplitude-js安装了原始的Amplitude SDK。我注意到有必要这样做,否则我的应用程序将不会仅使用@type包进行编译(这很有意义)。
我在app.module.ts中添加了以下几行




import { AmplitudeClient } from 'amplitude-js';

[...]
@NgModule({
    [...]
    providers: [
        AmplitudeClient,
        [...]
    ]
});






我还创建了一个AmplitudeProvider,它将管理我整个应用程序中的所有振幅事件:




import { Injectable } from '@angular/core';
import { HttpServiceProvider } from "../http-service/http-service";
import { AmplitudeClient } from 'amplitude-js';

/**
 * AmplitudeProvider
 * @description Handles Amplitude statistics
 */
@Injectable()
export class AmplitudeProvider {

  constructor(
    public http: HttpServiceProvider,
    public amplitude: AmplitudeClient
  ) {
    this.amplitude.init("MY_AMPLITUDE_KEY");
  }

  /**
   * logEvent
   * @description Logs an event in Amplitude
   * @param eventTitle Title of the event
   */
  public logEvent(title) {
      // Do things not relevant here
  }

}





我可以肯定我的依赖项注入和/或导入操作有问题,但是我不知道是什么。而且我看不到任何循环依赖关系,因为amplitude-js包不是我制作的,也不导入我的任何提供程序。

在此先感谢向我指出正确方向的任何人!

最佳答案

AmplitudeClient不是Ionic Provider,因此,您不能导入它并将其放入Class构造函数中。

要在您的提供者中使用振幅,您要导入振幅。您的代码应与此类似。

import amplitude, { AmplitudeClient } from 'amplitude-js';

@Injectable()
export class AmplitudeProvider {

  private client: AmplitudeClient;

  constructor(
    public http: HttpServiceProvider,
    public database: DatabaseProvider
  ) {
    this.client = amplitude.getInstance();
    this.client.init("MY_AMPLITUDE_KEY");
  }
}

09-18 03:15