Angular 如果函数

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) {

我有一个通用的REST服务,我想使用服务提供者调用它,以便传入URL。 我希望这样做,以便服务可以跨多个项目(每个项目使用不同的RESTAPI)重用,甚至可以在同一项目的不同组件中重用

我有以下作为我的服务提供商:

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中所示):

立即编译,但似乎它现在提供了实际功能。因此,我无法像以前那样访问实际服务。立即编译,但是现在好像它提供了实际的功能,所以我不能像以前那样访问实际的服务。