【问题标题】:angular2 share a http service layerangular2 共享一个http服务层
【发布时间】:2016-04-07 23:44:07
【问题描述】:

我需要创建一个可以在不同的 angular2 应用程序之间共享的服务。该服务将访问其余 api 并包装其数据,以便 Angular 应用程序可以使用它。如果我使用 angular2 http 服务,那么我需要将整个 angular2 作为服务的依赖项。

目前我希望将服务层作为一个单独的 npm 包,以便我可以在多个项目之间重用它。

有没有更好的方法来实现可重用性,而不是将整个angular2库安装到服务包中?

【问题讨论】:

  • 因此该服务具有angular npm 依赖项,该依赖项与父包(项目)共享。那有什么问题?显然,不应该将服务编译为 dist 以便能够使用与项目相同的angular。由于该服务不打算在非 Angular 环境中使用,它应该就这么简单。
  • @estus 该服务是另一个包。因此,如果可能的话,我希望能够只使用 http,而不是整个 angular2。当然我可以安装整个 ng2,因为项目也是 ng2,所以它只会安装一次。
  • 但是服务是由应用托管的,对吧?然后注入Http 将来自应用程序的注入器。服务包甚至不必具有 npm angular 依赖项(即使它具有,服务包中的 import ... from 'angular2/http' 可能会解析为与项目包中相同的 angular2/http,这就是 npm 包的工作方式)。这个问题在目前的状态下是模糊的,缺乏实际的代码,但看起来这里根本没有问题。

标签: angular angular2-services


【解决方案1】:
  • 您不需要使用 Angulars Http。您可以构建自己的类来调用XMLHttpRequest 或直接使用fetch API 或执行AJAX 请求的任何其他库。

  • Angular 将把 Http 移到它自己的包中(在 Angular2 主仓库之外)https://github.com/angular/http(正在进行中)

  • 您可以在 HTTP 服务层中创建与 Http 类的公共 API 匹配的接口,然后在引导 Angular 应用程序时将 Http 实例传递给服务。

    李>
interface MyHttp {
  get(url: string, options?: RequestOptionsArgs): Observable<Response>;
  ...
}

let myHttpService = new MyHttpService();

bootstrap(AppComponent1, [
    HTTP_PROVIDERS, 
    provide(MyHttpService, {
        deps: [Http], 
        useFactory: (http) => {
          if(!myHttpService.http) {
            myService.http = http;
          }
          return myService;
        })
    })]
);

然后在你的组件和服务中使用它

export class MyComponent {
  constructor(private _myHttp: MyHttpService) {
    this._myHttp.doSomething();
  }
}

提示:如果您还想注入您的MyHttpService 作为Http 的替代品(对于请求Http 的不受控制的组件和服务,请使用您的MyHttpService),则提供程序需要看起来不同。

【讨论】:

  • 根据 angular2 http repo,它的状态是非活动的。我了解,您可以使用自己的服务。但是 angular2 有一个可以一起模拟和测试它的基础设施。并且 angular2 主要是使用 angular2 服务构建的,例如 http。所以用你自己的方式和 angular2 是很奇怪的,因为它是一个假设你以有角度的方式做的框架。我错过了什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-04
  • 2018-10-18
  • 2012-04-20
  • 2018-01-27
  • 1970-01-01
  • 1970-01-01
  • 2018-03-16
相关资源
最近更新 更多