Angular 主从组件
admin
2023-02-17 08:00:05
0

此刻,HeroesComponent 同时显示了英雄列表和所选英雄的详情。

把所有特性都放在同一个组件中,将会使应用“长大”后变得不可维护。 你要把大型组件拆分成小一点的子组件,每个子组件都要集中精力处理某个特定的任务或工作流。

本页面中,你将迈出第一步 —— 把英雄详情移入一个独立的、可复用的 HeroDetailComponent

HeroesComponent 将仅仅用来表示英雄列表。 HeroDetailComponent 将用来表示所选英雄的详情。

你可以访问下面的链接 https://github.com/cwiki-us-angular/cwiki-us-angular-tour-of-heroes-master-detail 从 GitHub 上查看我们提供源代码。

制作 HeroDetailComponent

使用 Angular CLI 生成一个名叫 hero-detail 的新组件。

ng generate component hero-detail

这个命令会做这些事:

  • 创建一个目录 src/app/hero-detail.

在这个目录中会生成四个文件:

  • 作为组件样式的 CSS 文件。

  • 作为组件模板的 HTML 文件。

  • 存放组件类 HeroDetailComponent 的 TypeScript 文件。

  • HeroDetailComponent 类的测试文件。

该命令还会把 HeroDetailComponent 添加到 src/app/app.module.ts 文件中 @NgModule 的 declarations 列表中。

编写模板

从 HeroesComponent 模板的底部把表示英雄详情的 HTML 代码剪切粘贴到所生成的 HeroDetailComponent 模板中。

所粘贴的 HTML 引用了 selectedHero。 新的 HeroDetailComponent 可以展示任意英雄,而不仅仅所选的。因此还要把模板中的所有 selectedHero 替换为 hero

完工之后,HeroDetailComponent 的模板应该是这样的:

src/app/hero-detail/hero-detail.component.html

"hero">   

{{hero.name | uppercase}} Details

  
id: {{hero.id}}
  
          "hero.name" placeholder="name"/>      
 

添加 @Input() hero 属性

HeroDetailComponent 模板中绑定了组件中的 hero 属性,它的类型是 Hero

打开 HeroDetailComponent 类文件,并导入 Hero 符号。

src/app/hero-detail/hero-detail.component.ts (import Hero)

import { Hero } from '../hero';

hero 属性必须是一个带有 @Input() 装饰器的输入属性,因为外部的 HeroesComponent 组件将会绑定到它。就像这样:

"selectedHero">

修改 @angular/core 的导入语句,导入 Input 符号。

src/app/hero-detail/hero-detail.component.ts (import Input)

import { Component, OnInit, Input } from '@angular/core';

添加一个带有 @Input() 装饰器的 hero 属性。

@Input() hero: Hero;
这就是你要对 HeroDetailComponent 类做的唯一一项修改。 没有其它属性,也没有展示逻辑。这个组件所做的只是通过 hero 属性接收一个英雄对象,并显示它。

显示 HeroDetailComponent

HeroesComponent 仍然是主从视图。

在你从模板中剪切走代码之前,它自己负责显示英雄的详情。现在它要把这个职责委托给 HeroDetailComponent 了。

这两个组件将会具有父子关系。 当用户从列表中选择了某个英雄时,父组件 HeroesComponent 将通过把要显示的新英雄发送给子组件 HeroDetailComponent,来控制子组件。

你不用修改 HeroesComponent ,但是要修改它的模板

修改 HeroesComponent 的模板

HeroDetailComponent 的选择器是 'app-hero-detail'。 把  添加到 HeroesComponent 模板的底部,以便把英雄详情的视图显示到那里。

把 HeroesComponent.selectedHero 绑定到该元素的 hero 属性,就像这样:

heroes.component.html (HeroDetail binding)

"selectedHero">

[hero]="selectedHero" 是 Angular 的属性绑定语法。

这是一种单向数据绑定。从 HeroesComponent 的 selectedHero 属性绑定到目标元素的 hero 属性,并映射到了 HeroDetailComponent 的 hero 属性。

现在,当用户在列表中点击某个英雄时,selectedHero 就改变了。 当 selectedHero 改变时,属性绑定会修改 HeroDetailComponent 的 hero 属性,HeroDetailComponent 就会显示这个新的英雄。

修改后的 HeroesComponent 的模板是这样的:

heroes.component.html

My Heroes

 class="heroes">  
  • "let hero of heroes"    [class.selected]="hero === selectedHero"    (click)="onSelect(hero)">    class="badge">{{hero.id}} {{hero.name}}  
  •  "selectedHero">
    浏览器刷新,应用又像以前一样开始工作了。

    修改了什么?

    像以前一样,一旦用户点击了一个英雄的名字,该英雄的详情就显示在了英雄列表下方。 现在,HeroDetailComponent 负责显示那些详情,而不再是 HeroesComponent

    把原来的 HeroesComponent 重构成两个组件带来了一些优点,无论是现在还是未来:

    1. 你通过缩减 HeroesComponent 的职责简化了该组件。

    2. 你可以把 HeroDetailComponent 改进成一个功能丰富的英雄编辑器,而不用改动父组件 HeroesComponent

    3. 你可以改进 HeroesComponent,而不用改动英雄详情视图。

    4. 将来你可以在其它组件的模板中重复使用 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.tshttps://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.htmlhttps://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.htmlhttps://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.tshttps://github.com/cwiki-us-angular/cwiki-us-angular-tour-of-heroes-master-detail/blob/master/src/app/app.module.ts

    小结

    • 你创建了一个独立的、可复用的 HeroDetailComponent 组件。

    • 你用属性绑定语法来让父组件 HeroesComponent 可以控制子组件 HeroDetailComponent

    • 你用 @Input 装饰器来让 hero 属性可以在外部的 HeroesComponent 中绑定。

    https://www.cwiki.us/pages/viewpage.action?pageId=47841998


    相关内容

    热门资讯

    今日重大发现“边锋老友麻将究竟... 有 亲,根据资深记者爆料边锋老友麻将是可以开挂的,确实有挂(咨询软件无需...
    我来教教您“同城乐吧究竟有挂吗... 我来教教您“同城乐吧究竟有挂吗?”(其实是有挂)您好,同城乐吧这个游戏其实有挂的,确实是有挂的,需要...
    【今日要闻】“老铁联盟有没有挂... 有 亲,根据资深记者爆料老铁联盟是可以开挂的,确实有挂(咨询软件无需打开...
    高新兴机器人取得接线母座及用电... 国家知识产权局信息显示,广州高新兴机器人有限公司取得一项名为“接线母座及用电设备”的专利,授权公告号...
    终于懂了“凉山跑得快是不是有挂... 您好:凉山跑得快这款游戏可以开挂,确实是有挂的,需要了解加客服微信【9784099】很多玩家在这款游...
    终于了解“棋乐碰胡有挂吗?”(... 有 亲,根据资深记者爆料棋乐碰胡是可以开挂的,确实有挂(咨询软件无需打开...
    今日重大发现“青松游戏开挂器?... 有 亲,根据资深记者爆料青松游戏是可以开挂的,确实有挂(咨询软件无需打开...
    今日重磅消息“掌酷天天开心开挂... 今日重磅消息“掌酷天天开心开挂神器?”(外卦神器下载)您好,掌酷天天开心这个游戏其实有挂的,确实是有...
    今日重大消息“微信十三水开挂神... 网上科普关于“微信十三水有没有挂”话题很是火热,小编也是针对微信十三水作*弊开挂的方法以及开挂对应的...
    【今日要闻】“暗宝是不是有挂?... 有 亲,根据资深记者爆料暗宝是可以开挂的,确实有挂(咨询软件无需打开直接...