【问题标题】:Use custom Http service in Ionic 2 app在 Ionic 2 应用程序中使用自定义 Http 服务
【发布时间】:2017-01-25 19:11:25
【问题描述】:

我想对 Ionic 2 应用程序 (v2.0.0-beta.30) 中的每个 HTTP 请求做一些事情,所以我创建了自己的 Http 类来扩展 angular 的服务。像这样的:

@Injectable()
export class myHttp extends Http
{
    private myStuff(): void
    {
        //stuff to fo every request
    }

    public request(url: string | Request, options?: RequestOptionsArgs): Observable<Response>
    {
        this.myStuff();
        return super.request(url, options);
    }

    public get(url: string, options?: RequestOptionsArgs): Observable<Response>
    {
        this.myStuff();
        return super.get(url, options);
    }
// etc.
}

我有东西当前在Http 上调用函数,我不想更改所有东西来调用MyHttp。我希望任何发出请求的东西都不知道也不关心它实际上是在调用MyHttp。似乎应该有一种方法可以提供 MyHttp 而不是 Http,我只是不确定你会在哪里使用 Ionic 2 应用程序。

我尝试像这样添加ionicBootstrap 函数:

ionicBootstrap(MyApp, [new ProviderBuilder(Http).toClass(MyHttp)], {});

这只是给了我死亡的白屏。我还尝试添加到 MyApp 类的 @Component 装饰器,如下所示:

@Component({
    providers: [new ProviderBuilder(Http).toClass(MyHttp)],
    templateUrl: "build/app.html"
})

这会产生相同的白屏。我不确定我是否理解其中的区别,我尝试了toAlias 而不是toClass,结果相同。

当任何东西想注入Http时,我如何告诉注入器注入MyHttp

-------- 更新 -----------

我终于通过在提供程序数组中包含HTTP_PROVIDERS 来绕过死亡白屏。但是,它仍然在使用它的其他服务中注入Http 而不是MyHttp。我已经尝试了以下各项:

{ provide: Http, useClass: MyHttp }
provide(Http, {useClass: myHttp })
new ProviderBuilder(Http).toClass(MyHttp)

依赖Http的服务如下所示:

public constructor(http: Http)
{
    //...
}

我在这里放了一个调试器,我可以看到它是 angular 的 Http 而不是 MyHttp

-------- 更新 2 -----------

我尝试在不同的班级做同样的事情,我确实看到它有效。例如:

ionicBootstrap(MyApp, [new ProviderBuilder(MyOtherClass).toClass(MyOtherClass2)], {});

我看到MyOtherClass2 在请求MyOtherClass 时被注入。所以,我不知道我是否在MyHttp 中做错了什么,或者Http 是否存在一些错误。有没有人能够使用Http 成功做到这一点?

【问题讨论】:

    标签: angular ionic2 angular2-providers


    【解决方案1】:

    就像你可以阅读here一样,当你像这样注册provider时:

    // bootstrap
    ionicBootstrap(MyApp, [DataService]);
    
    // component
    @Component({
      ...
      providers: [DataService]
    })
    class AppComponent { }
    

    您使用的是快捷方式,而不是这样写:

    // at bootstrap
    ionicBootstrap(MyApp, [
      provide(DataService, {useClass: DataService})
    ]);
    
    // or in component
    @Component({
      ...
      providers: [
        provide(DataService, {useClass: DataService})
      ]
    })
    class AppComponent { }
    

    您可以使用该快捷方式,因为它的值与令牌相同。所以在你的情况下,你必须这样做:

    // at bootstrap
    ionicBootstrap(MyApp, [
      provide(Http, { useClass: myHttp })
    ]);
    
    // or in component
    @Component({
      ...
      providers: [
        provide(Http, {useClass: myHttp })
      ]
    })
    class AppComponent { }
    

    请记住,如果您将其添加到 Component,每次加载该组件时都会创建该服务的新实例。如果您想在整个应用程序中使用相同的实例(单例),您必须将其添加到 ionicBootstraptop-most Component来自您的应用。

    【讨论】:

    • 我首先尝试了 provide 函数,就像你在这里一样,但后来在角度源中看到它已被弃用。这就是我尝试使用ProviderBuilder 的原因。我试过你上面的方法,我得到了白屏。我不知道我是否只是在我的应用程序中遗漏了其他东西或什么......
    • 请查看我更新的问题,看看您是否可以提供更多信息。谢谢。
    • 您是否尝试过为 Http 服务创建别名?就像您可以阅读 here 一样,您可以通过添加 [MyHttp, { provide: Http, useExisting: MyHttp }] 来做到这一点。这样,您的自定义服务的同一个实例将用于解析 Http 和 MyHttp 引用。
    • 我试过这个没有成功。我刚刚为我的问题添加了另一个更新。当不处理 Http 时,事情似乎有效。我不确定MyHttp 会做错什么。
    【解决方案2】:

    这对我有用:

    你的 myHttp 应该从构造函数开始:

    @Injectable()
    export class myHttp extends Http{
    ...
        constructor(
            xhrBackend: XHRBackend,
            requestOptions: RequestOptions) {
            super(xhrBackend, requestOptions);
        }
    

    在您的 app.module.ts 中,您应该将您的提供程序导入为:

    import { Http, XHRBackend, RequestOptions } from '@angular/http';
    ...
    
    @NgModule({
      ...
      providers: [
        {
          provide: Http,
          useFactory: (backend: XHRBackend, defaultOptions: RequestOptions) => {
            return new myHttp(backend, defaultOptions);
          },
          deps: [XHRBackend, RequestOptions]
        }
    
      ]
    

    【讨论】:

      【解决方案3】:

      你不能使用[new...],你可以试试{ provide: Http, useClass: MyHttp } 它将是ionicBootstrap(MyApp, [{ provide: Http, useClass: MyHttp }], {});

      【讨论】:

      • 我试过这个,我的应用程序出现白屏。就像我在另一个答案中的评论一样,我不确定我是否只是在我的应用程序中遗漏了其他内容。
      • 请查看我更新的问题,看看您是否可以提供更多信息。谢谢。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-05-01
      • 2015-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多