此刻,HeroesComponent
同时显示了英雄列表和所选英雄的详情。html
把全部特性都放在同一个组件中,将会使应用“长大”后变得不可维护。 你要把大型组件拆分红小一点的子组件,每一个子组件都要集中精力处理某个特定的任务或工做流。git
本页面中,你将迈出第一步 —— 把英雄详情移入一个独立的、可复用的 HeroDetailComponent
。github
HeroesComponent
将仅仅用来表示英雄列表。 HeroDetailComponent
将用来表示所选英雄的详情。api
你能够访问下面的连接 https://github.com/cwiki-us-angular/cwiki-us-angular-tour-of-heroes-master-detail 从 GitHub 上查看咱们提供源代码。浏览器
HeroDetailComponent
使用 Angular CLI 生成一个名叫 hero-detail
的新组件。app
|
这个命令会作这些事:ide
src/app/hero-detail
.在这个目录中会生成四个文件:测试
HeroDetailComponent
的 TypeScript 文件。HeroDetailComponent
类的测试文件。该命令还会把 HeroDetailComponent
添加到 src/app/app.module.ts
文件中 @
NgModule 的 declarations 列表中。ui
从 HeroesComponent
模板的底部把表示英雄详情的 HTML 代码剪切粘贴到所生成的 HeroDetailComponent
模板中。
所粘贴的 HTML 引用了 selectedHero
。 新的 HeroDetailComponent
能够展现任意英雄,而不单单所选的。所以还要把模板中的全部 selectedHero
替换为 hero
。
完工以后,HeroDetailComponent
的模板应该是这样的:
src/app/hero-detail/hero-detail.component.html
|
@
Input()
hero 属性HeroDetailComponent
模板中绑定了组件中的 hero
属性,它的类型是 Hero
。
打开 HeroDetailComponent
类文件,并导入 Hero
符号。
src/app/hero-detail/hero-detail.component.ts (import Hero)
|
hero
属性必须是一个带有 @Input()
装饰器的输入属性,由于外部的 HeroesComponent
组件将会绑定到它。就像这样:
|
修改 @angular/core
的导入语句,导入 Input 符号。
src/app/hero-detail/hero-detail.component.ts (import Input)
|
添加一个带有 @
Input()
装饰器的 hero
属性。
|
这就是你要对 类作的惟一一项修改。 没有其它属性,也没有展现逻辑。这个组件所作的只是经过 属性接收一个英雄对象,并显示它。HeroDetailComponenthero
HeroDetailComponent
HeroesComponent
仍然是主从视图。
在你从模板中剪切走代码以前,它本身负责显示英雄的详情。如今它要把这个职责委托给 HeroDetailComponent
了。
这两个组件将会具备父子关系。 当用户从列表中选择了某个英雄时,父组件 HeroesComponent
将经过把要显示的新英雄发送给子组件 HeroDetailComponent
,来控制子组件。
你不用修改 HeroesComponent
类,可是要修改它的模板。
HeroesComponent
的模板HeroDetailComponent
的选择器是 'app-hero-detail'
。 把 <app-hero-detail>
添加到 HeroesComponent
模板的底部,以便把英雄详情的视图显示到那里。
把 HeroesComponent.selectedHero
绑定到该元素的 hero
属性,就像这样:
heroes.component.html (HeroDetail binding)
|
[hero]="selectedHero"
是 Angular 的属性绑定语法。
这是一种单向数据绑定。从 HeroesComponent
的 selectedHero
属性绑定到目标元素的 hero
属性,并映射到了 HeroDetailComponent
的 hero
属性。
如今,当用户在列表中点击某个英雄时,selectedHero
就改变了。 当 selectedHero
改变时,属性绑定会修改 HeroDetailComponent
的 hero
属性,HeroDetailComponent
就会显示这个新的英雄。
修改后的 HeroesComponent
的模板是这样的:
heroes.component.html
|
浏览器刷新,应用又像之前同样开始工做了。
像之前同样,一旦用户点击了一个英雄的名字,该英雄的详情就显示在了英雄列表下方。 如今,HeroDetailComponent
负责显示那些详情,而再也不是 HeroesComponent
。
把原来的 HeroesComponent
重构成两个组件带来了一些优势,不管是如今仍是将来:
HeroesComponent
的职责简化了该组件。HeroDetailComponent
改进成一个功能丰富的英雄编辑器,而不用改动父组件 HeroesComponent
。HeroesComponent
,而不用改动英雄详情视图。HeroDetailComponent
。你的应用应该变成了这样 在线例子 / 下载范例。本页所说起的代码文件以下:
若是你想直接在 stackblitz 运行本页中的例子,请单击连接:https://stackblitz.com/github/cwiki-us-angular/cwiki-us-angular-tour-of-heroes-master-detail
本页中所说起的代码以下:https://github.com/cwiki-us-angular/cwiki-us-angular-tour-of-heroes-master-detail
对应的文件列表和代码连接以下:
文件名 |
源代码 |
---|---|
src/app/hero-detail/hero-detail.component.ts | https://github.com/cwiki-us-angular/cwiki-us-angular-tour-of-heroes-master-detail/blob/master/src/app/hero-detail/hero-detail.component.ts |
src/app/hero-detail/hero-detail.component.html | https://github.com/cwiki-us-angular/cwiki-us-angular-tour-of-heroes-master-detail/blob/master/src/app/hero-detail/hero-detail.component.html |
src/app/heroes/heroes.component.html | https://github.com/cwiki-us-angular/cwiki-us-angular-tour-of-heroes-master-detail/blob/master/src/app/heroes/heroes.component.html |
src/app/app.module.ts | https://github.com/cwiki-us-angular/cwiki-us-angular-tour-of-heroes-master-detail/blob/master/src/app/app.module.ts |