Angular 2/4 Service Provider 不编译函数
Angular 2/4 Service Provider does not compile if a function
我有一个通用的 REST 服务,我想使用服务提供商调用它,以便我可以传入 URL。
我想这样做,以便该服务可以跨多个项目(每个项目使用不同的 REST API)甚至在同一项目的不同组件中重复使用。
我有以下服务提供商:
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/")
],
这现在将在我为项目(或构建)提供服务时出现错误:
ERROR in Error encountered resolving symbol values statically.
Function calls are not supported. Consider replacing the function or
lambda with a reference to an exported function (position 8:21 in the
original .ts file), resolving symbol ODataServiceProvider in
C:/dev/SVN/Products/PredictiveAnalytics/Trunk/Glencor
eAnalyticsPortal/GlencoreAnalyticsPortal.Webclient/src/app/shared/services/odata/odata.serviceProvider.ts,
resolving symbol AppModule in C:/dev/SVN/Products/P
redictiveAnalytics/Trunk/GlencoreAnalyticsPortal/GlencoreAnalyticsPortal.Webclient/src/app/app.module.ts,
resolving symbol AppModule in C:/dev/SVN/Products/Pr
edictiveAnalytics/Trunk/GlencoreAnalyticsPortal/GlencoreAnalyticsPortal.Webclient/src/app/app.module.ts
但是,如果我在服务和监视项目时保存任何文件,它现在不会抛出错误,一切都会按预期进行。
任何线索如何解决这个问题?这是 Angular 问题吗?
我不知道为什么会这样,但我遇到了类似的问题并按如下方式解决。
导出 returns 您的服务在您的 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 的简单字符串,提供者现在有 2 个 dependencies/parameters 它需要。
我们将把这两个都注入进去,这可以在任何组件中完成,如下所示(省略了不必要的代码):
import { ODataServiceProvider, URL } from './shared/services/odata/odata.serviceProvider';
import { Http } from '@angular/http';
import { ODataService } from './shared/services/odata/odata.service';
providers: [
{
provide: URL,
useValue: 'http://services.odata.org/V3/(S(pq1lpmgz0kuok05ubqtx1c2g))/OData/OData.svc/'
},
{
provide: ODataService,
useFactory: ODataServiceProvider,
deps: [URL, Http]
}
]
注意 URL 现在被指定为提供者,然后在部门中使用,这将允许它被注入到服务提供者。
不确定这是否是最好的做事方式,但它似乎有效。
如果服务提供商需要一组配置,如 Angular API 中所示,那么您实际上可以将 URL 字符串作为接口:
=12=]
我有一个通用的 REST 服务,我想使用服务提供商调用它,以便我可以传入 URL。 我想这样做,以便该服务可以跨多个项目(每个项目使用不同的 REST API)甚至在同一项目的不同组件中重复使用。
我有以下服务提供商:
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/")
],
这现在将在我为项目(或构建)提供服务时出现错误:
ERROR in Error encountered resolving symbol values statically. Function calls are not supported. Consider replacing the function or lambda with a reference to an exported function (position 8:21 in the original .ts file), resolving symbol ODataServiceProvider in C:/dev/SVN/Products/PredictiveAnalytics/Trunk/Glencor eAnalyticsPortal/GlencoreAnalyticsPortal.Webclient/src/app/shared/services/odata/odata.serviceProvider.ts, resolving symbol AppModule in C:/dev/SVN/Products/P redictiveAnalytics/Trunk/GlencoreAnalyticsPortal/GlencoreAnalyticsPortal.Webclient/src/app/app.module.ts, resolving symbol AppModule in C:/dev/SVN/Products/Pr edictiveAnalytics/Trunk/GlencoreAnalyticsPortal/GlencoreAnalyticsPortal.Webclient/src/app/app.module.ts
但是,如果我在服务和监视项目时保存任何文件,它现在不会抛出错误,一切都会按预期进行。 任何线索如何解决这个问题?这是 Angular 问题吗?
我不知道为什么会这样,但我遇到了类似的问题并按如下方式解决。
导出 returns 您的服务在您的 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 的简单字符串,提供者现在有 2 个 dependencies/parameters 它需要。 我们将把这两个都注入进去,这可以在任何组件中完成,如下所示(省略了不必要的代码):
import { ODataServiceProvider, URL } from './shared/services/odata/odata.serviceProvider';
import { Http } from '@angular/http';
import { ODataService } from './shared/services/odata/odata.service';
providers: [
{
provide: URL,
useValue: 'http://services.odata.org/V3/(S(pq1lpmgz0kuok05ubqtx1c2g))/OData/OData.svc/'
},
{
provide: ODataService,
useFactory: ODataServiceProvider,
deps: [URL, Http]
}
]
注意 URL 现在被指定为提供者,然后在部门中使用,这将允许它被注入到服务提供者。
不确定这是否是最好的做事方式,但它似乎有效。
如果服务提供商需要一组配置,如 Angular API 中所示,那么您实际上可以将 URL 字符串作为接口:
=12=]