我正在尝试使用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.
注意:我运行
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");
}
}