<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                組件初始化后,單元測試如下: ![image-20210412140340871](https://img.kancloud.cn/02/09/02094c24306181be7f64f30e2ca15c5a_1758x192.png) 錯誤信息提示說以`classId`命名的`FormControl`上沒有找到`value accessor`。如果以前報此類錯誤,我們有些茫然是正常的。但學習過自定義FormControl后,排醒此錯誤便應該有些眉目了。只所以發生上述錯誤,是由于在V層中我們使用了如下代碼: ```html <app-clazz-select formControlName="clazzId"></app-clazz-select> ``` 上述錯誤產生的根本原因是當前動態測試模塊并不認識`app-clazz-select`,當然就更不知道`app-clazz-select`是我們自定義的`FormControl`了。 ## import 我們按下圖嘗試修正出現的單元測試的錯誤: ![image-20210412103338742](https://img.kancloud.cn/9d/f5/9df50ef0ec594819c419800866d1fd1b_2282x450.png) 在動態測試模塊中引入班級選擇模塊: ```typescript +++ b/first-app/src/app/student/add/add.component.spec.ts @@ -2,6 +2,7 @@ import {ComponentFixture, TestBed} from '@angular/core/testing'; import {AddComponent} from './add.component'; import {ReactiveFormsModule} from '@angular/forms'; +import {ClazzSelectModule} from '../../clazz/clazz-select/clazz-select.module'; describe('student -> AddComponent', () => { let component: AddComponent; @@ -11,7 +12,8 @@ describe('student -> AddComponent', () => { await TestBed.configureTestingModule({ declarations: [AddComponent], imports: [ - ReactiveFormsModule + ReactiveFormsModule, + ClazzSelectModule ] }) ``` `import`包括了`ClazzSelectComponent`組件的`ClazzSelectModule`后,錯誤依舊:`app-clazz-select`仍然未被識別為`FormControl`。 一般這種情況是在創建自己定義組件時沒有完全符合以下兩種規范造成的: - 組件未實現`ControlValueAccessor`接口 - 組件未`provider` -> `NG_VALUE_ACCESSOR` 對于有單元測試的我們而言,上述兩種情況都不大可能,因為在班級選擇組件的單元測試中,我們在父組件中對其進行了測試: ```typescript first-app/src/app/clazz/clazz-select/clazz-select.component.spec.ts @Component({ template: ` <app-clazz-select [formControl]="clazzId"></app-clazz-select>` }) class TestComponent { clazzId = new FormControl(); } ``` 這說明`app-clazz-select`必然是符合`FormControl`規范的。 ## 私有與公有 要解決這個問題,就要談談模塊中的組件、指令和管道的公有**與**私有**了。 默認情況下處于模塊`declarations`聲明中的組件、指令和管道都是**私有**的,在當前模塊的任意組件中可以自由地使用它們。而當模塊(A)被`import`進入其它模塊(B)時,由于A模塊中元素的**私有**性,B模塊無法使用A模塊中的任意私有元素(組件、指令和管道)。 所以在當前的代碼下,進行`imports`時,實際如下圖所示: ![image-20210412144236951](https://img.kancloud.cn/75/35/75350e239c5901dd595a0347897a843a_1390x414.png) 如上圖所示:私有的班級選擇組件并沒有成功的并引入到動態測試模塊中來,所以動態測試模塊并無法解析`app-clazz-select`,當然就更別談將其做為`FormControl`來看待了。 ## exports 若想將Angular中的組件、指令和管道設置為公有的,則需要將其添加到`exports`中: ```typescript +++ b/first-app/src/app/clazz/clazz-select/clazz-select.module.ts @@ -9,6 +9,9 @@ import {ReactiveFormsModule} from '@angular/forms'; imports: [ CommonModule, ReactiveFormsModule + ], + exports: [ + ClazzSelectComponent ] }) export class ClazzSelectModule { ``` 此時`ClazzSelectComponent`的屬性變更為**公有**,當動態測試模塊引入班級選擇模塊時便開始同步引入了這個班級選擇組件了。當然也就認識了`app-clazz-select`,以及感知到其是一個合格的`FormControl`了。 ![image-20210412144647751](https://img.kancloud.cn/5b/26/5b261d301d17edd064d3b1d5a76007fd_1390x426.png) 此時不能識別為`FormControl`的錯誤消失,轉而顯示新的錯誤如下: ![image-20210412144938734](https://img.kancloud.cn/02/d5/02d5e34a8517002f5de6b00271708416_1586x162.png) 加入MockApi后錯誤消失: ```typescript +++ b/first-app/src/app/student/add/add.component.spec.ts @@ -3,6 +3,7 @@ import {ComponentFixture, TestBed} from '@angular/core/testing'; import {AddComponent} from './add.component'; import {ReactiveFormsModule} from '@angular/forms'; import {ClazzSelectModule} from '../../clazz/clazz-select/clazz-select.module'; +import {MockApiTestingModule} from '../../mock-api/mock-api-testing.module'; describe('student -> AddComponent', () => { let component: AddComponent; @@ -13,7 +14,8 @@ describe('student -> AddComponent', () => { declarations: [AddComponent], imports: [ ReactiveFormsModule, - ClazzSelectModule + ClazzSelectModule, + MockApiTestingModule ] }) .compileComponents(); ``` 最終效果如下: ![image-20210412145049101](https://img.kancloud.cn/11/5c/115c549d2861430b51e831bd9860313d_1164x742.png) 最后,手動的發送后面的模擬數據,并重新渲染V層,以使班級選擇組件中默認有數據可選: ```typescript +++ b/first-app/src/app/student/add/add.component.spec.ts @@ -30,5 +30,7 @@ describe('student -> AddComponent', () => { fit('should create', () => { expect(component).toBeTruthy(); + getTestScheduler().flush(); + fixture.detectChanges(); }); }); ``` ![image-20210412145309498](https://img.kancloud.cn/4b/f6/4bf636333dc19886c487809d5a626097_1180x268.png) | 名稱 | 鏈接 | | ---------------- | ------------------------------------------------------------ | | `imports` 數組 | [https://angular.cn/guide/bootstrapping#the-imports-array](https://angular.cn/guide/bootstrapping#the-imports-array) | | `exports` | [https://angular.cn/api/core/NgModule#exports](https://angular.cn/api/core/NgModule#exports) | | 共享特性模塊 | [https://angular.cn/guide/sharing-ngmodules#sharing-modules](https://angular.cn/guide/sharing-ngmodules#sharing-modules) | | 本節源碼(含答案) | [https://github.com/mengyunzhi/angular11-guild/archive/step7.2.1.zip](https://github.com/mengyunzhi/angular11-guild/archive/step7.2.1.zip) |
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看