NgModule中的声明,提供程序和导入有什么区别?

时间:2016-08-21 09:51:38

标签: angular angular-module

我想了解Angular(有时称为Angular2 +),然后我遇到了@Module

  1. 进口

  2. 声明

  3. 提供商

  4. 关注Angular Quick Start

6 个答案:

答案 0 :(得分:418)

角度概念

  • imports使当前模块中的其他模块的导出声明可用
  • declarations用于将当前模块中的指令(包括组件和管道)用于当前模块中的其他指令。指令,组件或管道的选择器仅在声明或导入时才与HTML匹配。
  • providers将使DI(依赖注入)知道服务和值。它们被添加到根作用域中,并将它们注入到将它们作为依赖项的其他服务或指令中。

providers的特殊情况是延迟加载的模块,它们可以获得自己的子注入器。延迟加载模块的providers默认情况下仅提供给此延迟加载的模块(不是整个应用程序,因为它与其他模块一样)。

有关模块的更多详细信息,另请参阅https://angular.io/docs/ts/latest/guide/ngmodule.html

  • exports使组件,指令和管道可用于将此模块添加到imports的模块中。 exports也可用于重新导出CommonModule和FormsModule等模块,这些模块通常在共享模块中完成。

  • entryComponents注册用于离线编译的组件,以便它们可以与ViewContainerRef.createComponent()一起使用。路由器配置中使用的组件是隐式添加的。

TypeScript(ES2015)导入

import ... from 'foo/bar'may resolve to an index.ts)用于TypeScript导入。只要在另一个打字稿文件中声明的打字稿文件中使用标识符,就需要这些。

Angular的@NgModule() imports和TypeScript import完全不同的概念

另见jDriven - TypeScript and ES6 import syntax

  

其中大多数实际上都是TypeScript使用的简单的ECMAScript 2015(ES6)模块语法。

答案 1 :(得分:72)

x = tf.placeholder("float", [None, 256000]):用于导入支持模块,如FormsModule,RouterModule,CommonModule或任何其他自定义功能模块。

imports:用于声明属于当前模块的组件,指令和管道。 声明中的所有内容都相互认识。例如,如果我们有一个组件,比如UsernameComponent,它显示用户名列表,我们也有一个管道,比如toupperPipe,它将字符串转换为大写字母字符串。现在如果我们想在UsernameComponent中以大写字母显示用户名,我们可以使用之前创建的toupperPipe但是UsernameComponent如何知道toupperPipe存在以及我们如何访问和使用它,这里是声明,我们可以声明UsernameComponent和toupperPipe。

declarations:用于注入模块中组件,指令,管道所需的服务。

请在此处详细阅读:https://angular.io/docs/ts/latest/guide/ngmodule.html

答案 2 :(得分:37)

声明组件,导入模块,并提供服务。我正在使用的一个例子:

import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';


import { AppComponent } from './app.component';
import {FormsModule} from '@angular/forms';
import { UserComponent } from './components/user/user.component';
import { StateService } from './services/state.service';    

@NgModule({
  declarations: [
    AppComponent,
    UserComponent
  ],
  imports: [
    BrowserModule,
    FormsModule
  ],
  providers: [ StateService ],
  bootstrap: [ AppComponent ]
})
export class AppModule { }

答案 3 :(得分:11)

角度@NgModule的构造:

  1. import { x } from 'y';:这是用于从其他文件导入代码的标准打字稿语法(ES2015/ES6模块语法)。 这不是特定于Angular的。从技术上讲,这也不是模块的一部分,只是有必要在此文件的范围内获取所需的代码。
  2. imports: [FormsModule]:您在此处导入其他模块。例如,在下面的示例中,我们导入FormsModule。现在,我们可以在整个模块中使用FormsModule必须提供的功能。
  3. declarations: [OnlineHeaderComponent, ReCaptcha2Directive]:您将组件,指令和管道放在此处。一旦在这里声明,您现在就可以在整个模块中使用它们。例如,我们现在可以在OnlineHeaderComponent视图(html文件)中使用AppComponent。 Angular知道在OnlineHeaderComponent中声明了该@NgModule的位置。
  4. providers: [RegisterService]:在此定义了我们对特定模块的服务。您可以通过依赖注入来注入组件中的服务。

示例模块:

// Angular
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { FormsModule } from '@angular/forms';

// Components
import { AppComponent } from './app.component';
import { OfflineHeaderComponent } from './offline/offline-header/offline-header.component';
import { OnlineHeaderComponent } from './online/online-header/online-header.component';

// Services
import { RegisterService } from './services/register.service';

// Directives
import { ReCaptcha2Directive } from './directives/re-captcha2.directive';

@NgModule({
  declarations: [
    OfflineHeaderComponent,,
    OnlineHeaderComponent,
    ReCaptcha2Directive,
    AppComponent
  ],
  imports: [
    BrowserModule,
    FormsModule,
  ],
  providers: [
    RegisterService,
  ],
  entryComponents: [
    ChangePasswordComponent,
    TestamentComponent,
    FriendsListComponent,
    TravelConfirmComponent
  ],
  bootstrap: [AppComponent]
})
export class AppModule { }

答案 4 :(得分:5)

添加快速备忘单,在与Angular长时间休息后可能会有所帮助:


声明

示例:

declarations: [AppComponent]

我们可以在此处注入什么?组件,管道,指令


进口

示例:

imports: [BrowserModule, AppRoutingModule]

我们可以在这里注入什么?其他模块


提供商

示例:

providers: [UserService]

我们可以在这里注入什么?服务


BOOTSTRAP

示例:

bootstrap: [AppComponent]

我们可以在此处注入什么?该模块将生成的主要组件(组件树的顶级父节点)


输入组件

示例:

entryComponents: [PopupComponent]

我们可以在此处注入什么?动态生成的组件(例如,通过使用ViewContainerRef.createComponent())


导出

示例:

export: [TextDirective, PopupComponent, BrowserModule]

我们可以在此处注入什么?我们希望在另一个模块(导入此模块后)中可以访问它们的组件,指令,模块或管道

答案 5 :(得分:0)

  1. 声明: 此属性说明组件,指令 和属于此模块的管道。
  2. 出口: 声明的子集应该是可见的,并且 可以在其他NgModule的组件模板中使用。
  3. 进口: 其他模块需要导出其类的模块 此NgModule中声明的组件模板。
  4. 提供者: 此NgModule所贡献的服务的创建者 全球服务集合;他们成为所有人都可访问的 应用程序的各个部分。 (您也可以在组件上指定提供商 级别,通常是首选。)
  5. 引导程序: 主应用程序视图称为根组件, 托管所有其他应用程序视图。只有根NgModule应该设置 bootstrap属性。