2017-06-06 33 views
2

在我的Angular應用程序中,我使用共享服務,因爲數據不斷更新,所以我不需要成爲單例服務。Angular 4.1.3使用AOT時,Service Factory返回undefined

服務工廠:

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 }); 
} 

我有些訂閱功能抽象從我的組件,它處理掉取消訂閱以防止內存泄漏,這就是爲什麼代碼看起來很奇怪。

回答

2

爲了使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); 
} 
+1

我認爲與AOT應該在編譯失敗,如果它不能被分析。我已經改變了const factoryFunction =(http:Http)=>返回新的DataService;由於編譯失敗,但我從來沒有想過導出函數!萬分感謝。 – user1119648