本节我们正式引入了Angular的最重要的组成部分:服务。 服务是由服务提供者提供的,所以这些提供者们在Angular中被称为`provider`。每个提供者都可以以`{provide: xxx}`的方式声明在模块的`providers`中。 与组件、指令、管道默认是私有的不同,某个模块中的服务默认属性却是公有的,而且没有办法将其声明为私有。 Angular通过`imports`的方式引入其它模块的同时,相当于引用了其它模块公有的组件、指令、管道与服务。有意思的与在某个模块中声明服务不同的是,当使用`imports`引用其它模块公有的组件、指令、管道与服务后,这些被引用的组件、指令、管道,同时包括服务都会被当前模块声明为私有。 比如A依赖于B、B依赖于C。在默认情况下,A是无法使用C的公有属性的,若要使用A在依赖于B时便可以使用C层的公有属性,则需要在B中将C声明为公有。Angular使用这种方式限制了做为公有属性服务的传递,从而有效的避免了大项目中的服务污染。 除对Angular的模块组成调用有了进一步的认识以外,我们还在此基础上手动的提供了`Router`、`ActivatedRoute`。而这也为我们在单元测试中模拟路由提供了技术支撑。 在使用快照的方式获取完路由参数后,我们又尝试了使用可订阅的路由参数的方式来获取路由参数。相对于使用快照的方式,订阅路由参数使得我们可以忽略组件是否会被重新实例化,在软件的可移植性方面这无疑提到了有效的提升。 如果你对上面的知识认识还感觉不够直观,原因大概有2种:第一种是我们思索的不够多,因为有些知识是需要我们先理解,然后才能够记住的;第二种则是我们写的不够多,因为有些知道点就像是打篮球,只有练的多了才能成为高手。 简单的事情重复做,你就是专家;重复的事情认真做,你就是赢家。