Estou tentando entender Angular (às vezes chamado Angular2 +), e me deparei com @Module
:
Importações
Declarações
Fornecedores
Após o início rápido angular
Estou tentando entender Angular (às vezes chamado Angular2 +), e me deparei com @Module
:
Importações
Declarações
Fornecedores
Após o início rápido angular
Respostas:
Conceitos angulares
imports
disponibiliza as declarações exportadas de outros módulos no módulo atualdeclarations
devem disponibilizar diretivas (incluindo componentes e tubos) do módulo atual para outras diretivas no módulo atual. Os seletores de diretivas, componentes ou tubulações são compatíveis apenas com o HTML se forem declarados ou importados.providers
devem tornar os serviços e valores conhecidos pelo DI (injeção de dependência). Eles são adicionados ao escopo raiz e são injetados em outros serviços ou diretivas que os possuem como dependência.Um caso especial providers
são os módulos carregados preguiçosamente que recebem seu próprio injetor infantil. providers
de um módulo carregado lento são fornecidos somente a este módulo carregado lento por padrão (não o aplicativo inteiro como em outros módulos).
Para mais detalhes sobre os módulos, consulte também https://angular.io/docs/ts/latest/guide/ngmodule.html
exports
disponibiliza os componentes, diretrizes e tubulações nos módulos aos quais esse módulo é adicionado imports
. exports
também pode ser usado para reexportar módulos como CommonModule e FormsModule, que geralmente é feito em módulos compartilhados.
entryComponents
registra componentes para compilação offline para que eles possam ser usados ViewContainerRef.createComponent()
. Os componentes usados nas configurações do roteador são adicionados implicitamente.
Importações TypeScript (ES2015)
import ... from 'foo/bar'
(que pode resolver para umindex.ts
) são para importações TypeScript. Você precisa delas sempre que usar um identificador em um arquivo datilografado declarado em outro arquivo datilografado.
Angular @NgModule()
imports
e TypeScript import
são conceitos totalmente diferentes .
Consulte também jDriven - sintaxe de importação TypeScript e ES6
A maioria deles é na verdade simples sintaxe do módulo ECMAScript 2015 (ES6) que o TypeScript também usa.
import
é uma funcionalidade JS (ES2015), não uma TypeScript. :)
imports
, mas exportar seus declaráveis (componente, diretiva, canal) com exports
. Então, os principais alvos imports
e exports
são coisas diferentes. Em vez disso, o principal objetivo exports
é o seu declarations
. Você declara seu componente por declarations
, mas para o componente carregado dinâmico, é necessário inseri-lo entryComponents
. Enquanto isso, eles providers
são gerenciados em outra história pela DI.
imports
são usados para importar módulos de suporte, como FormsModule, RouterModule, CommonModule ou qualquer outro módulo de recurso personalizado.
declarations
são usados para declarar componentes, diretivas, tubulações que pertencem ao módulo atual. Todos dentro das declarações se conhecem. Por exemplo, se tivermos um componente, digamos UsernameComponent, que exibe uma lista dos nomes de usuário e também temos um canal, digamos toupperPipe, que transforma uma string em uma letra maiúscula. Agora, se queremos mostrar nomes de usuário em letras maiúsculas em nosso UsernameComponent, podemos usar o toupperPipe que criamos anteriormente, mas a questão é como o UsernameComponent sabe que o toupperPipe existe e como ele pode acessá-lo e usá-lo. Aí vêm as declarações, podemos declarar UsernameComponent e toupperPipe.
Providers
são usados para injetar os serviços exigidos por componentes, diretivas, tubulações no módulo.
Os componentes são declarados, os módulos são importados e os serviços são fornecidos. Um exemplo com o qual estou trabalhando:
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 { }
@NgModule
Construções angulares :import { x } from 'y';
: Esta é a sintaxe padrão de texto datilografado ( ES2015/ES6
sintaxe do módulo) para importar código de outros arquivos. Isto não é específico angular . Além disso, tecnicamente, isso não faz parte do módulo, é apenas necessário obter o código necessário dentro do escopo deste arquivo.imports: [FormsModule]
: Você importa outros módulos aqui. Por exemplo, importamos FormsModule
no exemplo abaixo. Agora podemos usar a funcionalidade que o FormsModule tem a oferecer ao longo deste módulo.declarations: [OnlineHeaderComponent, ReCaptcha2Directive]
: Você coloca seus componentes, diretrizes e tubos aqui. Uma vez declarado aqui, agora você pode usá-los em todo o módulo. Por exemplo, agora podemos usar o OnlineHeaderComponent
na AppComponent
visualização (arquivo html). Angular sabe onde encontrar isso OnlineHeaderComponent
porque é declarado no @NgModule
.providers: [RegisterService]
: Aqui nossos serviços deste módulo específico são definidos. Você pode usar os serviços em seus componentes injetando injeção de dependência.// 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 { }
Adicionando uma folha de dicas rápidas que pode ajudar após o longo intervalo com o Angular:
Exemplo:
declarations: [AppComponent]
O que podemos injetar aqui? Componentes, tubos, diretivas
Exemplo:
imports: [BrowserModule, AppRoutingModule]
O que podemos injetar aqui? outros módulos
Exemplo:
providers: [UserService]
O que podemos injetar aqui? Serviços
Exemplo:
bootstrap: [AppComponent]
O que podemos injetar aqui? o componente principal que será gerado por este módulo (nó pai principal de uma árvore de componentes)
Exemplo:
entryComponents: [PopupComponent]
O que podemos injetar aqui? componentes gerados dinamicamente (por exemplo, usando ViewContainerRef.createComponent ())
Exemplo:
export: [TextDirective, PopupComponent, BrowserModule]
O que podemos injetar aqui? componentes, diretrizes, módulos ou tubulações que gostaríamos de ter acesso a eles em outro módulo (após a importação deste módulo)
forRoot()
em um módulo carregado preguiçosamente. Você concorda? Consulte O módulo principal . O link para # shared-module-for-root não existe mais.