zoukankan      html  css  js  c++  java
  • Angular懒加载模块使用http拦截失效问题

    使用HTTP拦截器时必须导入HttpClientModule

    全局AppModule导入HttpClientModule

    就要先导入 Angular 的 HttpClientModule。大多数应用都会在根模块 AppModule 中导入它。

    // app.module.ts
    import { NgModule }         from '@angular/core';
    import { BrowserModule }    from '@angular/platform-browser';
    import { HttpClientModule } from '@angular/common/http';
    
    @NgModule({
      imports: [
        BrowserModule,
        // import HttpClientModule after BrowserModule.
        HttpClientModule,
      ],
      declarations: [
        AppComponent,
      ],
      bootstrap: [ AppComponent ]
    })
    export class AppModule {}
    

    使用HTTP拦截器

    要实现拦截器,就要实现一个实现了 HttpInterceptor 接口中的 intercept() 方法的类。

    // app.interceptor.ts
    import { Injectable } from '@angular/core';
    import {
      HttpEvent, HttpInterceptor, HttpHandler, HttpRequest
    } from '@angular/common/http';
    
    import { Observable } from 'rxjs';
    
    /** Pass untouched request through to the next request handler. */
    @Injectable()
    export class Interceptor implements HttpInterceptor {
    
      intercept(req: HttpRequest<any>, next: HttpHandler):
        Observable<HttpEvent<any>> {
        return next.handle(req);
      }
    }
    

    注入拦截器

    // app.module.ts
    import { NgModule }         from '@angular/core';
    import { BrowserModule }    from '@angular/platform-browser';
    import { HttpClientModule } from '@angular/common/http';
    import { HTTP_INTERCEPTORS } from '@angular/common/http';
    
    // import class Interceptor
    import { Interceptor } from './services/app.interceptor';
    
    @NgModule({
      imports: [
        BrowserModule,
        // import HttpClientModule after BrowserModule.
        HttpClientModule,
      ],
      declarations: [
        AppComponent,
      ],
      providers: [
        {
          provide: HTTP_INTERCEPTORS,
          useClass: Interceptor,
          multi: true,
        },
      ],
      bootstrap: [ AppComponent ]
    })
    export class AppModule {}
    

    懒加载模块无法触发拦截器的问题

    因为使用拦截器是要在模块中导入HttpClientModule才可以使用对应里面的一些功能,因此如果在懒加载模块中使用HttpClientModule这个模块,将会导致全局的被覆盖,所以懒加载模块无法使用全局的拦截。

    删除多余的HttpClientModule

    // other.module.ts
    @NgModule({
      imports: [
        BrowserModule,
        // HttpClientModule 删除多余的模块,即可发现全局拦截生效
      ]
    })
    export class OtherModule {}
    
  • 相关阅读:
    winform 上传文件 (多种)
    获取Treeview中CheckBox选中项的技巧(winform)
    C#中class与struct的区别
    在SQL Server数据库中批量导入数据的四种方法
    小东西WinForm的等待窗口
    查询及删除重复记录的方法
    一些算法的复习和整理,争取每天一个算法
    POJ 2965 The Pilots Brothers' refrigerator
    HDU 1492 The number of divisors(约数) about Humble Numbers
    HDU 1495 非常可乐
  • 原文地址:https://www.cnblogs.com/chenfengami/p/13231053.html
Copyright © 2011-2022 走看看