# 总结 君子博学而日参省乎己,则知明而行无过矣。 ## 文件命名 组件C层以 `component.ts`结尾,组件V层是标准的html文件,组件样式是标准的CSS文件,单元测试文件以`spec.ts`结尾,模块文件以`module.ts`结尾。 ## 模块与组件 我在本章中共接触了一个模块文件`app.module.ts`,该模块由`AppComponent`,`AddComponent`以及`EditComponent`组成: ```typescript declarations: [ AppComponent, AddComponent, EditComponent ], ``` 从而我们得出如下结论:**组件是模块的一部分** ![image-20210228172606027](https://img.kancloud.cn/14/de/14de94b8e79938eafff7deacb1db77f0_1448x502.png) 模块之所以称为模块,是由于在其上使用了`NgModule`注解: ```typescript @NgModule({ }) export class AppModule { } ``` 除此以外,我们还可以在karma负责的单元测试文件中,使用`TestBed`来创建动态临时的模块: ```typescript beforeEach(async () => { await TestBed.configureTestingModule({ imports: [ HttpClientModule, RouterTestingModule ], declarations: [ AppComponent ], }).compileComponents(); }); ``` 而无论使用哪种方式创建的模块,其均由:`declarations`,`imports`,`providers`组成。如果该模块为系统启动的入口模块,则还需要为其配置`bootstrap`以指定启动组件。 ![image-20210228173021966](https://img.kancloud.cn/c6/77/c6778e95733b9e82f3a492baa4baeb92_1410x542.png) 一个组件有三部分组成,负责逻辑处理的C层,负责展示基础结构的V层,以及负责个性化美颜的CSS文件。 ![image-20210228171723233](https://img.kancloud.cn/a3/a9/a3a99019752d7c52ae1baae975f36054_876x438.png) ## 依赖注入 Angular是个大管家,对模块的能力进行管理。在组件的构造函数或是V层中发现了什么,就尝试注入什么。如果没有注入的能力,则会报NoProvider的异常。 我们可以在子组件`EditComponent`中注入一个父组件`AppComponent`表明一个模块拥有的能力取决于其`declarations`的内容;我们还可以注入`HttpClientModule`中拥有的`HttpClient`,表明一个模块的能力还取决于其亲友团`imports` ;在 edit组件的单元测试中,我们又通过`providers`的方式提供了`AppComponent`,表明一个模块的能力还取决于其另一个亲友团`providers`。 ![image-20210228173649880](https://img.kancloud.cn/03/03/03032b8d25dc3ab8bf395f7c3c1dc124_2126x656.png) ## 链接调用 我们广泛的接触了`a.b.c.d`或`a().b().c().d()`的调用形式,这是由于每调用一次我们都会得到另外一下对象。就是我们前面给出的`httpClient.get().subscribe()`一样。这样做的好处是可以省略很多中间冗余变量,代码也变得更加的简洁。 ![image-20210228174304963](https://img.kancloud.cn/7b/35/7b351526c7e2d304eaf7c68b1caca445_1522x552.png) ## 回调函数 没有回调函数前,我们只能改变某个被调函数的数据;有了回调函数后,我们可以改变回调函数的算法。回调常常与异步结合使用,我们将其使用到了调用api资源上。 ![image-20210228174519225](https://img.kancloud.cn/84/59/8459e6b3055ff16fc1872f8f219d9c1c_516x284.png) ## CV交互 C层中被声明`public`的属性、方法,V层均可直接使用。如果某个方法是被V层使用的,我们会习惯性的以 `on` 打头。 V层可以使用插值与模板表达式与C层交互,还可以使用事件及属性。 ## HTTP请求 我们接触了4种请求方法: - 用于查询数据的GET方法 - 用于新建数据的POST方法 - 用于更新数据的PUT方法 - 用于删除数据的DELETE方法 其实还有一个用于请求是否允许跨域的OPTIONS请求方法,你可以使用`ng s`启动系统并尝试添加、修改、删除教师时,在Firefox的控制台中找到它的身影。 ![image-20210301102518985](https://img.kancloud.cn/a1/ac/a1ac1f82ebab456d21ddf62c64c19a69_1656x328.png) ## 测试与开发 测试与开发是两个完全独立的世界,互相看不到。所以小组件们才会胆大包天地在开发中说自己属于`AppModule`,在测试中却说自己属于`DynamicTestModule`。 好了,就到这里。