Angular 4.1.3 使用AOT时,服务工厂returns undefined
Angular 4.1.3 When using AOT, Service Factory returns undefined
在我的 Angular 应用程序中,我使用了一个共享服务,因为数据不断更新,所以我不需要是单例。
服务工厂:
import {DataService} from '../../../../shared/services/data.service';
import {Http} from '@angular/http';
export const DataServiceProvider = {
provide: DataService,
useFactory(http: Http) {
return new DataService(http);
},
deps: [Http]
};
当我 运行 应用程序处于 JIT 模式时,工厂工作正常,但是当我使用 --aot 标志构建时,我收到以下错误。
ERROR Error: Uncaught (in promise): TypeError: Cannot read property 'get' of undefined
TypeError: Cannot read property 'get' of undefined
返回的服务有一个调用服务器的 get() 方法。我无法理解 AOT 中是什么破坏了这个看似简单的功能。
作为附加参考,我在构造函数中注入了服务:
construct(
dataService: DataService
) {
super();
}
并在 ngOnInit() 中调用它:
ngOnOnit() {
this.subscribe(this.dataService.get(), (res) => { this.data = res });
}
我有一些订阅功能从我的组件中抽象出来,处理取消订阅以防止内存泄漏,这就是为什么该代码看起来很奇怪。
为了让 AOT 工作,所有函数都需要是静态可分析的。有关详细信息,请参阅 this Medium article。由于您要导出一个对象,并且该对象上有一个匿名函数,因此也请尝试导出该函数。像这样更新你的工厂:
import {DataService} from '../../../../shared/services/data.service';
import {Http} from '@angular/http';
export const DataServiceProvider = {
provide: DataService,
useFactory: dataServiceProviderUseFactory,
deps: [Http]
};
export function dataServiceProviderUseFactory(http: Http) {
return new DataService(http);
}
在我的 Angular 应用程序中,我使用了一个共享服务,因为数据不断更新,所以我不需要是单例。
服务工厂:
import {DataService} from '../../../../shared/services/data.service';
import {Http} from '@angular/http';
export const DataServiceProvider = {
provide: DataService,
useFactory(http: Http) {
return new DataService(http);
},
deps: [Http]
};
当我 运行 应用程序处于 JIT 模式时,工厂工作正常,但是当我使用 --aot 标志构建时,我收到以下错误。
ERROR Error: Uncaught (in promise): TypeError: Cannot read property 'get' of undefined
TypeError: Cannot read property 'get' of undefined
返回的服务有一个调用服务器的 get() 方法。我无法理解 AOT 中是什么破坏了这个看似简单的功能。
作为附加参考,我在构造函数中注入了服务:
construct(
dataService: DataService
) {
super();
}
并在 ngOnInit() 中调用它:
ngOnOnit() {
this.subscribe(this.dataService.get(), (res) => { this.data = res });
}
我有一些订阅功能从我的组件中抽象出来,处理取消订阅以防止内存泄漏,这就是为什么该代码看起来很奇怪。
为了让 AOT 工作,所有函数都需要是静态可分析的。有关详细信息,请参阅 this Medium article。由于您要导出一个对象,并且该对象上有一个匿名函数,因此也请尝试导出该函数。像这样更新你的工厂:
import {DataService} from '../../../../shared/services/data.service';
import {Http} from '@angular/http';
export const DataServiceProvider = {
provide: DataService,
useFactory: dataServiceProviderUseFactory,
deps: [Http]
};
export function dataServiceProviderUseFactory(http: Http) {
return new DataService(http);
}