Angular 如果函数
我有一个通用的REST服务,我想使用服务提供者调用它,以便传入URL。 我希望这样做,以便服务可以跨多个项目(每个项目使用不同的RESTAPI)重用,甚至可以在同一项目的不同组件中重用 我有以下作为我的服务提供商:Angular 如果函数,angular,angular2-services,service-provider,Angular,Angular2 Services,Service Provider,我有一个通用的REST服务,我想使用服务提供者调用它,以便传入URL。 我希望这样做,以便服务可以跨多个项目(每个项目使用不同的RESTAPI)重用,甚至可以在同一项目的不同组件中重用 我有以下作为我的服务提供商: import { Http } from '@angular/http'; import { ODataService } from './odata.service'; export function ODataServiceProvider(url: string) {
import { Http } from '@angular/http';
import { ODataService } from './odata.service';
export function ODataServiceProvider(url: string) {
return {
provide: ODataService,
useFactory: (http: any) => {
return new ODataService(url, http);
},
deps: [Http]
}
}
理论上,我现在应该能够在单个组件或app.module级别使用此服务提供商,并通过url传递;我在app.module.ts中这样做过:
providers: [
SafeUrlPipe,
ODataServiceProvider("http://services.odata.org/V3/(S(pq1lpmgz0kuok05ubqtx1c2g))/OData/OData.svc/")
],
现在,当我为项目(或构建)提供服务时,会出现以下错误:
静态解析符号值时遇到错误。
不支持函数调用。考虑替换函数或
引用导出函数的lambda(中的位置8:21
原始.ts文件),正在解析中的符号ODataServiceProvider
C:/dev/SVN/Products/PredictiveAnalytics/Trunk/Glencor
EAnalyticPortal/GlencoreAnalyticsPortal.Webclient/src/app/shared/services/odata/odata.serviceProvider.ts,
解析C:/dev/SVN/Products/P中的符号AppModule
redictiveAnalytics/Trunk/GlencoreAnalyticsPortal/GlencoreAnalyticsPortal.Webclient/src/app/app.module.ts,
解析C:/dev/SVN/Products/Pr中的符号AppModule
DedictiveAnalytics/Trunk/GlencoreAnalyticsPortal/GlencoreAnalyticsPortal.Webclient/src/app/app.module.ts
但是,如果我在项目服务和被监视时保存任何文件,它现在不会抛出错误,并且一切都将按预期工作。
有什么线索可以解决这个问题吗?这是一个角度问题吗?我不知道为什么会发生这种情况,但我遇到了一个类似的问题,并解决了如下问题 导出一个函数,该函数在ngmodule外部返回服务构建,然后在提供者内部使用{provide:,useFactory:}调用它
export function myDataService() {
return ODataServiceProvider("http://services.odata.org/V3/(S(pq1lpmgz0kuok05ubqtx1c2g))/OData/OData.svc/");
}
@NgModule({
...
providers: [
SafeUrlPipe,
{
provide: MyProvider,
useFactory: myDataService
}
]
})
一定是这样的…我不知道为什么会发生这种情况,但我遇到了一个类似的问题,解决方法如下 导出一个函数,该函数在ngmodule外部返回服务构建,然后在提供者内部使用{provide:,useFactory:}调用它
export function myDataService() {
return ODataServiceProvider("http://services.odata.org/V3/(S(pq1lpmgz0kuok05ubqtx1c2g))/OData/OData.svc/");
}
@NgModule({
...
providers: [
SafeUrlPipe,
{
provide: MyProvider,
useFactory: myDataService
}
]
})
它一定是这样的…通过使用注入令牌并稍微更改服务提供商,使其按预期工作: 新的服务提供商如下:
import { Http } from '@angular/http';
import { ODataService } from './odata.service';
import { InjectionToken } from '@angular/core';
export const URL = new InjectionToken<string>('url');
export function ODataServiceProvider(url: string, http: Http) {
return new ODataService(url, http);
}
注意,URL现在被指定为提供者,然后在deps中使用,这将允许将其注入服务提供者
不确定这是否是做事情的最佳方式,但似乎有效
如果服务提供商需要一组配置,如Angular API中所示,则为了进一步扩展此功能,实际上可以将URL字符串作为一个接口:使用注入令牌并稍微更改服务提供商,使其按预期工作: 新的服务提供商如下:
import { Http } from '@angular/http';
import { ODataService } from './odata.service';
import { InjectionToken } from '@angular/core';
export const URL = new InjectionToken<string>('url');
export function ODataServiceProvider(url: string, http: Http) {
return new ODataService(url, http);
}
注意,URL现在被指定为提供者,然后在deps中使用,这将允许将其注入服务提供者
不确定这是否是做事情的最佳方式,但似乎有效
如果服务提供商需要一组配置(如Angular API中所示):立即编译,但似乎它现在提供了实际功能。因此,我无法像以前那样访问实际服务。立即编译,但是现在好像它提供了实际的功能,所以我不能像以前那样访问实际的服务。