Angular 6:为什么即使不导入HttpClientModule,HttpClient也能正常工作?

时间:2019-01-27 12:58:21

标签: typescript angular6 angular-httpclient angular-module

我通过运行ng new first-project安装了准系统的Angle 6项目,并获得了默认的应用程序模块和组件。现在,我通过运行ng generate module viewng generate component view/view在其中创建了一个新模块和一个组件。 现在我的app.module.ts看起来像这样

import { NgModule } from '@angular/core';
import { FormsModule } from '@angular/forms';
import { HttpClientModule } from '@angular/common/http';

import { AppRoutingModule } from './app-routing.module';
import { AppComponent } from './app.component';
import { TestService } from './test.service';
import { ViewModule } from './view/view.module';

@NgModule({
    declarations: [
        AppComponent
    ],
    imports: [
        BrowserModule,
        AppRoutingModule,
        FormsModule,
        HttpClientModule,
        ViewModule
    ],
    providers: [
        TestService
    ],
    bootstrap: [AppComponent]
})
export class AppModule { }

view.module.ts

import { CommonModule } from '@angular/common';
import { FormsModule } from '@angular/forms';

import { ViewComponent } from './view/view.component';

@NgModule({
    declarations: [ViewComponent],
    imports: [
        CommonModule,
        FormsModule
    ],
    exports: [
        ViewComponent
    ]
})
export class ViewModule { }

view.component.ts

import { HttpClient } from '@angular/common/http';

@Component({
  selector: 'app-view',
  templateUrl: './view.component.html',
  styleUrls: ['./view.component.css']
})
export class ViewComponent implements OnInit {

    username: string = "";
    response: any;

    constructor (private http: HttpClient) { }

    search () {
        this.http.get('https://api.github.com/users/' + this.username)
        .subscribe((response) => {
            this.response = response;
            console.log(this.response);
        });
    }

}

问题是,我没有在view.module.ts内导入HttpClientModule,而是在app.module.ts内导入,我直接在view.component.ts内导入HttpClient我什至得到了回应。 为了测试这种情况是否经常发生,我从view.module.ts中删除了FormsModule导入,以查看我在view.component.html内部使用的[(ngModel)]是否仍然有效,因为我已经导入了{{ 1}}放在app.module.ts中,但是没有。

我的问题是,为什么HttpClientModule允许我将其导入并在不同模块中使用它,为什么其他模块不能那样工作? 我试图在网上找到原因,但找不到。谁能告诉我原因?谢谢。

其他信息: 1.如果我未在任何地方导入FormsModule,则HttpClient不起作用。 因此,需要将模块导入项目中的某个位置。 2.它也以另一种方式工作,即,将模块导入view.module.ts内部,并在app.component.ts内部使用。这意味着,我只需在模块中导入一次即可在整个项目中使用HttpClientModule

1 个答案:

答案 0 :(得分:2)

根据Angular的official document,不需要将HttpClientModule导入view.module.ts中,只要将其导入AppModule.ts中即可。

这是该网站的报价:

  

在使用HttpClient之前,需要导入Angular HttpClientModule。大多数应用程序都是在根AppModule中这样做的。   将HttpClientModule导入AppModule后,您可以将HttpClient注入到应用程序类中,如下面的ConfigService示例所示。