小白的晉級之路--Angular

目錄

一、@ViewChild

二、獲取路由參數

三、loadChildren

四、Angular請求另一服務的API(請求代理)

五、angular路由

六、Angular之constructor和ngOnInit差異及適用場景

七、表單中的數據流

1、響應式表單中的數據流

2、模板驅動表單中的數據流


現在接觸的技術棧是Angular,從零開始,點滴積累,努力提升。

一、@ViewChild

https://www.jianshu.com/p/ac5366abfa74

providers: [ ChildService ]

在上面的子組件裏面provider裏面提供了一個ChildService類。我們也是可以通過@ViewChild來拿到這個ChildService類的。代碼如下

@ViewChild(ChildService) childService: ChildService;

 項目中有個功能是修改密碼,將修改密碼這個模態框封裝爲一個組件,嵌入在主頁面中,那麼在主頁面中是這樣引入的:

<modify-password #modifyPwd></modify-password>
修改密碼所觸發的方法:<li nz-menu-item (click)="modifyPassword()">修改密碼</li>
在ts文件中是這樣引入的:@ViewChild('modifyPwd', {static: false}) modifyPwd;
這樣調用的:
modifyPassword() {
    // 修改密碼
    this.modifyPwd.show();
  }
而在修改密碼模態框的ts文件中show方法是這樣的:
show() {
    this.oldPassword = '';
    this.newPassword = '';
    this.repeatPassword = '';
    this.isVisible = true;
  }

二、獲取路由參數

this.route.queryParams.subscribe(queryParams => {
   let productId = queryParams.productId;
   let title = queryParams.title;
});

三、loadChildren

在看代碼的過程中,發現路由有這樣兩種表現形式:

loadChildren是延遲加載子模塊,這對於加載頁面的性能有很好的提升。通俗的講就是說進入主模塊的時候,子模塊不加載,等需要進入子模塊的時候才加載。項目劃分模塊的時候,使用loadChildren配置路由是最佳選擇方案。

因此當訪問子模塊的時候,就回去找相應目錄下export的模塊。

四、Angular請求另一服務的API(請求代理)

看代碼的時候,想知道前端是如何向服務端發送請求的,結果找service文件沒發現有請求地址。請教之後,知道使用了代理。直接創建一個proxy.conf.json文件,定義所有/api的請求重定向到http://api.yourdomai.com。

而在angular.json文件中,angular-cli已經有這個命令了,在我們啓動項目的時候,會請求這個代理,而我們在寫代碼的時候,直接在相應的文件中,寫請求接口後面的部分就好了。

五、angular路由

https://angular.cn/guide/router#milestone-6-asynchronous-routing

大多數帶路由的應用都要在index.html的 <head> 標籤下先添加一個 <base> 元素,來告訴路由器該如何合成導航用的 URL。

路由器需要先配置纔會有路由信息。並用 RouterModule.forRoot() 方法來配置路由器, 並把它的返回值添加到 AppModule 的 imports 數組中。 

這裏的路由數組 appRoutes 描述如何進行導航。 把它傳給 RouterModule.forRoot() 方法並傳給本模塊的 imports 數組就可以配置路由器。

RouterOutlet 是一個來自路由模塊中的指令,它的用法類似於組件。 它扮演一個佔位符的角色,用於在模板中標出一個位置,路由器將會把要顯示在這個出口處的組件顯示在這裏。

<router-outlet></router-outlet>

<a routerLink="/crisis-center" routerLinkActive="active">Crisis Center</a>

路由守衛:https://www.cnblogs.com/starof/p/9012193.html

六、Angular之constructor和ngOnInit差異及適用場景

constructor和OnInit的執行時間不同,constructor是類初始化的時候,而OnInit在組件初始化的時候,有的屬性在OnInit可以訪問到但是在constructor訪問不到,OnInit是組件的生命週期函數,比constructor慢,業務邏輯放OnInit。

https://blog.csdn.net/u010730126/article/details/64486997/

七、表單中的數據流

https://blog.csdn.net/sfx_ss/article/details/89278096

https://angular.cn/guide/forms-overview

1、響應式表單中的數據流

下面這些步驟列出了 "從視圖到模型" 數據流的梗概。

  1. 最終用戶在輸入框元素中鍵入了一個值,這裏是 "Blue"。

  2. 這個輸入框元素會發出一個帶有最新值的 "input" 事件。

  3. 這個控件值訪問器 ControlValueAccessor 會監聽表單輸入框元素上的事件,並立即把新值傳給 FormControl 實例。

  4. FormControl 實例會通過 valueChanges 這個可觀察對象發出這個新值。

  5. valueChanges 的任何一個訂閱者都會收到這個新值。

    下面這些步驟列出了從模型到視圖的數據流的梗概。

  6. favoriteColorControl.setValue() 方法被調用,它會更新這個 FormControl 的值。

  7. FormControl 實例會通過 valueChanges 這個可觀察對象發出新值。

  8. valueChanges 的任何訂閱者都會收到這個新值。

  9. 該表單輸入框元素上的控件值訪問器會把控件更新爲這個新值。

2、模板驅動表單中的數據流

下面這些步驟列出了當輸入框的值從 Red 變成 Blue 時 "從視圖到模型" 的數據流概況。

  1. 最終用戶在輸入框元素中敲 "Blue"。

  2. 該輸入框元素會發出一個 "input" 事件,帶着值 "Blue"。

  3. 附着在該輸入框上的控件值訪問器會觸發 FormControl 實例上的 setValue() 方法。

  4. FormControl 實例通過 valueChanges 這個可觀察對象發出新值。

  5. valueChanges 的任何訂閱者都會收到新值。

  6. 控件值訪問器 ControlValueAccessory 還會調用 NgModel.viewToModelUpdate() 方法,它會發出一個 ngModelChange 事件。

  7. 由於該組件模板雙向數據綁定到了 favoriteColor,組件中的 favoriteColor 屬性就會修改爲 ngModelChange 事件所發出的值("Blue")。

    下面這些步驟列出了當 favoriteColor 從 Blue 變爲 Red 時,"從模型到視圖" 的數據流概況。

  • 組件中修改了 favoriteColor 的值。
  • 變更檢測開始。
  • 在變更檢測期間,由於這些輸入框之一的值發生了變化,Angular 就會調用 NgModel 指令上的 ngOnChanges 生命週期鉤子。
  • ngOnChanges() 方法會把一個異步任務排入隊列,以設置內部 FormControl 實例的值。
  • 變更檢測完成。
  • 在下一個檢測週期,用來爲 FormControl 實例賦值的任務就會執行。
  • FormControl 實例通過可觀察對象 valueChanges 發出最新值。
  • valueChanges 的任何訂閱者都會收到這個新值。
  • 控件值訪問器 ControlValueAccessor 會使用 favoriteColor 的最新值來修改表單的輸入框元素。

八、用命令新建組件或相關文件

在 Angular 中,最好在一個獨立的頂級模塊中加載和配置路由器,它專注於路由功能,然後由根模塊 AppModule 導入它。

按照慣例,這個模塊類的名字叫做 AppRoutingModule,並且位於 src/app 下的 app-routing.module.ts 文件中。

使用 CLI 生成它。

ng generate module app-routing --flat --module=app
    

--flat 把這個文件放進了 src/app 中,而不是單獨的目錄中。
--module=app 告訴 CLI 把它註冊到 AppModuleimports 數組中。

// 創建服務文件
ng generate service message

// 創建組件
ng generate component messages

九、通過命令創建組件報錯

通過ng generate component tableTest創建組件的時候,報錯如下:

原因是,我的目錄裏面有兩個xx.module.ts文件,分別是pipe.module.ts和app.module.ts兩個文件,此時需要指定創建的組件的聲明需要添加到哪個文件裏面。

ng generate component shared/example --module=app.module.ts

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章