Tôi đang cố gắng hiểu Angular (đôi khi được gọi là Angular2 +), sau đó tôi tình cờ thấy @Module
:
Nhập khẩu
Tuyên bố
Nhà cung cấp
Sau khi bắt đầu nhanh góc
Tôi đang cố gắng hiểu Angular (đôi khi được gọi là Angular2 +), sau đó tôi tình cờ thấy @Module
:
Nhập khẩu
Tuyên bố
Nhà cung cấp
Sau khi bắt đầu nhanh góc
Câu trả lời:
Khái niệm góc cạnh
imports
làm cho các khai báo xuất của các mô-đun khác có sẵn trong mô-đun hiện tạideclarations
là để làm cho các chỉ thị (bao gồm các thành phần và đường ống) từ mô-đun hiện tại có sẵn cho các chỉ thị khác trong mô-đun hiện tại. Bộ chọn chỉ thị, thành phần hoặc đường ống chỉ được khớp với HTML nếu chúng được khai báo hoặc nhập.providers
là để làm cho các dịch vụ và giá trị được biết đến với DI (tiêm phụ thuộc). Chúng được thêm vào phạm vi gốc và chúng được đưa vào các dịch vụ hoặc chỉ thị khác có chúng là phụ thuộc.Một trường hợp đặc biệt cho providers
các mô-đun được tải lười biếng có được trình tiêm con riêng của chúng. providers
của một mô-đun tải lười biếng chỉ được cung cấp cho mô-đun tải lười biếng này theo mặc định (không phải toàn bộ ứng dụng như với các mô-đun khác).
Để biết thêm chi tiết về các mô-đun, hãy xem https://angular.io/docs/ts/latest/guide/ngmodule.html
exports
làm cho các thành phần, chỉ thị và đường ống có sẵn trong các mô-đun thêm mô-đun này vào imports
. exports
cũng có thể được sử dụng để xuất lại các mô-đun như CommonModule và FormsModule, thường được thực hiện trong các mô-đun chia sẻ.
entryComponents
đăng ký các thành phần để biên dịch ngoại tuyến để chúng có thể được sử dụng với ViewContainerRef.createComponent()
. Các thành phần được sử dụng trong cấu hình bộ định tuyến được thêm vào ngầm.
Nhập khẩu TypeScript (ES2015)
import ... from 'foo/bar'
( có thể giải quyết thành mộtindex.ts
) dành cho nhập TypeScript. Bạn cần những thứ này bất cứ khi nào bạn sử dụng mã định danh trong tệp bản thảo được khai báo trong tệp bản in khác.
Angular's @NgModule()
imports
và TypeScript import
là hai khái niệm hoàn toàn khác nhau .
Xem thêm jDriven - Cú pháp nhập kiểu TypeScript và ES6
Hầu hết trong số chúng thực sự là cú pháp mô-đun ECMAScript 2015 (ES6) đơn giản mà TypeScript cũng sử dụng.
import
là một chức năng JS (ES2015), không phải là một TypeScript. :)
imports
, nhưng xuất các khai báo của bạn (thành phần, chỉ thị, đường ống) với exports
. Vì vậy, các mục tiêu chính của imports
và exports
là những thứ khác nhau. Thay vào đó, mục tiêu chính exports
là của bạn declarations
. Bạn khai báo thành phần của mình bằng declarations
, nhưng đối với thành phần được tải động, bạn cần đặt chúng vào entryComponents
. Trong khi đó, providers
DI được quản lý trong một câu chuyện khác bởi DI.
imports
được sử dụng để nhập các mô-đun hỗ trợ như FormsModule, RouterModule, CommonModule hoặc bất kỳ mô-đun tính năng tùy chỉnh nào khác.
declarations
được sử dụng để khai báo các thành phần, chỉ thị, đường ống thuộc về mô-đun hiện tại. Mọi người bên trong khai báo đều biết nhau. Ví dụ: nếu chúng ta có một thành phần, giả sử UsernameComponent, hiển thị danh sách tên người dùng và chúng ta cũng có một đường ống, giả sử toupperPipe, chuyển đổi một chuỗi thành chuỗi ký tự viết hoa. Bây giờ Nếu chúng tôi muốn hiển thị tên người dùng bằng chữ in hoa trong UsernameComponent thì chúng tôi có thể sử dụng toupperPipe mà chúng tôi đã tạo trước đây nhưng câu hỏi là làm thế nào UsernameComponent biết rằng toupperPipe tồn tại và làm thế nào nó có thể truy cập và sử dụng nó. Ở đây có các khai báo, chúng ta có thể khai báo UsernameComponent và toupperPipe.
Providers
được sử dụng để tiêm các dịch vụ theo yêu cầu của các thành phần, chỉ thị, đường ống trong mô-đun.
Các thành phần được khai báo, Mô-đun được nhập và Dịch vụ được cung cấp. Một ví dụ tôi đang làm việc với:
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
Cấu trúc góc :import { x } from 'y';
: Đây là cú pháp bản thảo tiêu chuẩn ( ES2015/ES6
cú pháp mô-đun) để nhập mã từ các tệp khác. Đây không phải là cụ thể góc . Ngoài ra, đây về mặt kỹ thuật không phải là một phần của mô-đun, chỉ cần lấy mã cần thiết trong phạm vi của tệp này.imports: [FormsModule]
: Bạn nhập các mô-đun khác vào đây. Ví dụ chúng tôi nhập FormsModule
trong ví dụ dưới đây. Bây giờ chúng ta có thể sử dụng chức năng mà FormsModule phải cung cấp trong suốt mô-đun này.declarations: [OnlineHeaderComponent, ReCaptcha2Directive]
: Bạn đặt các thành phần, chỉ thị và đường ống của bạn ở đây. Sau khi khai báo ở đây, bây giờ bạn có thể sử dụng chúng trong toàn bộ mô-đun. Ví dụ bây giờ chúng ta có thể sử dụng OnlineHeaderComponent
trong AppComponent
view (file html). Angular biết nơi để tìm thấy điều này OnlineHeaderComponent
bởi vì nó được khai báo trong @NgModule
.providers: [RegisterService]
: Ở đây các dịch vụ của chúng tôi về mô-đun cụ thể này được xác định. Bạn có thể sử dụng các dịch vụ trong các thành phần của mình bằng cách tiêm chích phụ thuộc.// 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 { }
Thêm một bảng cheat nhanh có thể giúp ích sau thời gian nghỉ dài với Angular:
Thí dụ:
declarations: [AppComponent]
Chúng ta có thể tiêm gì ở đây? Linh kiện, ống dẫn, chỉ thị
Thí dụ:
imports: [BrowserModule, AppRoutingModule]
Chúng ta có thể tiêm gì ở đây? các mô-đun khác
Thí dụ:
providers: [UserService]
Chúng ta có thể tiêm gì ở đây? dịch vụ
Thí dụ:
bootstrap: [AppComponent]
Chúng ta có thể tiêm gì ở đây? thành phần chính sẽ được tạo bởi mô-đun này (nút cha trên cùng cho cây thành phần)
Thí dụ:
entryComponents: [PopupComponent]
Chúng ta có thể tiêm gì ở đây? các thành phần được tạo động (ví dụ: bằng cách sử dụng ViewContainerRef.createComponent ())
Thí dụ:
export: [TextDirective, PopupComponent, BrowserModule]
Chúng ta có thể tiêm gì ở đây? các thành phần, chỉ thị, mô-đun hoặc đường ống mà chúng tôi muốn có quyền truy cập vào chúng trong một mô-đun khác (sau khi nhập mô-đun này)
forRoot()
trong một mô-đun tải lười biếng. Bạn có đồng ý không? Xem Mô-đun lõi . Liên kết đến # shared-module-for-root không còn tồn tại.