Tour of Heroes应用程序有新的要求: 添加一个Dashboard视图。 添加在Heroes和Dashboard视图之间导航的功能。...定义一个AppComponent类。 使用my-app选择器在类的上方添加@Component注解。 将以下英雄组件移到AppComponent: title类属性。...在路由和导航页面阅读有关默认路由和重定向的更多信息。 将导航添加到dashboard 在模板上添加dashboard 导航链接,在heroes链接上方。...应该显示英雄11的详细信息。 在仪表板或英雄列表中选择英雄不起作用。 你会接下来的处理。...在HeroesComponent中选择一个英雄 在HeroesComponent中,当前的模板展示了一个“主/细节”风格,顶部是英雄列表,下方是选定的英雄的详细信息。
在本页面,你将扩展《英雄指南》应用,让它显示一个英雄列表, 并允许用户选择一个英雄,查看该英雄的详细信息。 创建模拟(mock)英雄数据 你需要一些英雄数据以供显示。...在 src/app/ 文件夹中创建一个名叫 mock-heroes.ts 的文件。 定义一个包含十个英雄的常量数组 HEROES,并导出它。 该文件是这样的。.../mock-heroes'; 往类中添加一个 heroes 属性,这样可以暴露出这些英雄,以供绑定。...添加 click 事件处理器 把该组件的 hero 属性改名为 selectedHero,但不要为它赋值。 因为应用刚刚启动时并没有所选英雄。...点击一个英雄,它的详情就出现了。 这个应用看起来又再次工作正常显示了。 英雄显示在列表中,当你单击英雄的名字的时候,有关你单击英雄的详细信息就显示在页面的底部了。
这是你在ngFor指令中定义的同一个英雄变量。 在用户输入页面和模板语法页面的事件绑定部分了解有关事件绑定的更多信息。...添加一个点击处理程序来显示选定的英雄 你不再需要hero属性,因为你不再显示一个英雄; 你正在显示一个英雄列表。 但是用户可以通过点击选择一个英雄。...添加一个onSelect()方法,将selectedHero属性设置为用户单击的英雄。...在结构指令页面和模板语法页面的内置指令部分阅读有关ngIf和ngFor的更多信息。 格式化选中hero 当选择的英雄细节显示在列表下方时,很难在列表中识别选定的英雄。...在上面添加的样式元数据中,有一个名为selected的自定义CSS类。 为了让选定的英雄更清晰可见,当用户点击英雄名字时,你将把这个选定的class应用到。
您可以通过将HTML模板中的控件绑定到Angular组件的属性来显示数据。 在这个页面中,您将创建一个包含英雄列表的组件。 您将显示英雄名单的列表,并有条件地在列表下方显示一条消息。...在任一种样式中,模板数据绑定都具有对组件属性的相同访问权限。 用* ngFor显示一个列表属性 要显示英雄列表,首先向组件添加英雄名字列表,并将myHero重新定义为列表中的第一个名字。...在“模板语法”页面的microsyntax部分阅读有关模板输入变量的更多信息。 Angular为列表中的每个项目复制,将hero变量设置为当前迭代中的项目(英雄)。...现在英雄出现在一个无序的列表中。 ? 为数据创建一个类 应用程序的代码直接在组件内定义数据,这不是最佳实践。 但是,在一个简单的演示中,没关系。 目前,绑定是一个字符串列表。...在实际应用中,大多数绑定是针对更专业化的对象。 要将此绑定转换为使用专用对象,请将英雄名称列表转换为Hero对象列表。 为此,你需要一个Hero类。
随着“英雄之旅”应用的发展,您将添加更多需要访问英雄数据的组件。 不是一遍又一遍复制和粘贴相同的代码,而是创建一个可重用的数据服务,并将其注入到需要它的组件中。...创建一个英雄服务 利益相关者希望以不同的页面以各种方式展示英雄。 用户可以从列表中选择一个英雄。 不久,您将添加一个仪表板与顶尖的表演英雄,并创建一个单独的视图编辑英雄的细节。...在“Asynchronous Programming: Futures”的Dart语言教程中阅读更多有关Futures的信息。 ...有关异步函数的更多信息,请参阅在Dart语言浏览中声明异步函数。 处理Future 由于对HeroService的更改,应用程序组件的英雄属性现在是Future,而不是英雄列表。...) => this.heroes = heroes); } 该回调将组件的英雄属性设置为服务返回的英雄列表。
它们应该聚焦于展示数据,而把数据访问的职责委托给某个服务。 本节课,你将创建一个 HeroService,应用中的所有类都可以使用它来获取英雄列表。...不要使用 new 来创建此服务,而要依靠 Angular 的依赖注入机制把它注入到 HeroesComponent 的构造函数中。 服务是在多个“互相不知道”的类之间共享信息的好办法。...你要用一个注入器注册它。注入器就是一个对象,负责在需要时选取和注入该提供商。...添加 getHeroes() 创建一个函数,以从服务中获取这些英雄数据。...上一个版本把英雄的数组赋值给了该组件的 heroes 属性。 这种赋值是同步的,这里包含的假设是服务器能立即返回英雄数组或者浏览器能在等待服务器响应时冻结界面。
你离开的地方 在前一页中,您学会了在仪表板和固定英雄列表之间导航,沿途编辑选定的英雄。 这是这个页面的起点。 在继续英雄之旅之前,请确认您具有以下结构。 ?...模拟Web API 在你有一个可以处理英雄数据请求的Web服务器之前,HTTP客户端将从模拟服务(内存中的Web API)中获取并保存数据。...id : int.parse(id); 英雄和HTTP 在目前的HeroService实现中,返回一个用模拟英雄解决的Future。...响应JSON有一个单一的数据属性,它拥有主叫方想要的英雄列表。 所以你抓住这个列表并把它作为已解决的Future值返回。 请注意服务器返回的数据的形状。...当应用程序使用模拟英雄列表时,更新直接应用于单个应用程序范围的共享列表中的英雄对象。 现在,您正在从服务器获取数据,如果您希望更改持续存在,则必须将其写回服务器。
它从服务中接收heroes并且在列表中展示它们.用户可以添加一个新的Hero并且保存到服务端. 下面是应用程序的UI: ? 此demo有一个单独的组件, HeroListComponent....获取数据 在之前的示例中,应用通过返回服务中的模拟英雄来伪造与服务器的交互: import 'dart:async'; import 'package:angular/angular.dart';...有关解码和编码JSON的示例,请参阅Dart库游览的dart:convert部分。 码后的JSON不会列出英雄。 相反,服务器将JSON结果封装到具有数据属性的对象中。...调用HeroService的组件只需要heroes。 它与负责获取数据的代码以及响应对象分离。 始终处理错误 处理I / O的一个重要部分是通过准备捕捉它们并与它们做某些事情来预测错误。...英雄在一个拥有自己data属性的响应对象中。
一个组件控制屏幕中的一小块视图。 例如,以下视图由组件控制: 与导航链接的应用程序根。 英雄名单。 英雄编辑 您可以在一个类中定义一个组件的应用程序逻辑 - 它支持视图的功能。...该类通过属性和方法的API与视图交互。 例如,这个HeroListComponent有一个heroes属性,返回从服务中获取的英雄列表。...HeroListComponent还有一个selectHero()方法,当用户点击从列表中选择一个英雄时,它会设置一个selectedHero属性。...自定义组件与原生HTML在相同的布局中无缝混合。 元数据 ? 元数据告诉Angular如何处理一个类。 回顾HeroListComponent的代码,你可以看到它只是一个类。...当用户点击英雄的名字时,(click)事件绑定调用组件的selectHero方法。 双向数据绑定是一个重要的第四种形式,它使用ngModel指令将属性和事件绑定在一个符号中。
显然,一些值可以从一些编辑中受益。 您可能会注意到,您希望在许多应用程序内部和许多应用程序中重复执行许多相同的转换。 你几乎可以把它们想象成风格。...在API参考的管道主题中了解更多关于这些和许多其他内置管道的信息; 过滤包含单词“管道”的条目。 由于本页附录中解释了Angular没有FilterPipe或OrderByPipe的原因。...纯净和不纯的管道 有两类管道:纯净和不纯。 管道默认是纯净的。 到目前为止,你看到的每个管道都是纯净的。 通过将pure设置为false,可以使管道不纯。...您可以在实例(查看源代码)中确认,当您添加英雄时,即使您变更heroes列表,飞行英雄也会显示更新。 不纯的AsyncPipe Angular AsyncPipe是一个不纯管道的有趣例子。...该组件可以公开一个filteredHeroes或sortedHeroes属性,并控制执行支持逻辑的时间和频率。 您可以在管道中放置并在应用程序中共享的任何功能都可以写入过滤/排序服务并注入到组件中。
'; } Car类在其构造函数中创建它需要的所有东西。 有什么问题? 问题在于Car类是脆弱的,不灵活的,难以测试。 这辆车需要引擎和轮胎。...它的唯一目的是显示显示英雄名字列表的HeroListComponent。 HeroListComponent的这个版本从mockHeroes获取它的英雄,这是一个在单独文件中定义的内存集合。...英雄和HTTP教程部分介绍了这样的英雄服务。 这里的重点是服务注入,所以同步服务就足够了。 注册一个服务提供商 一个服务只是Angular中的一个类,直到您使用Angular依赖注入器注册它。...具有依赖关系的供给类 也许EvenBetterLogger可以在日志消息中显示用户名。 此记录器从注入的UserService获取用户,该用户服务也在应用程序级别注入。...您可以在层次依赖注入中了解更多关于其高级功能的信息,从对嵌套注入器的支持开始。 附录:直接使用注射器 开发人员很少直接使用注入器,但是这里有一个InjectorComponent。
HeroDetailComponent有一个英雄,而不是一个选定的英雄。 在模板中的任何地方用单词“hero”替换“selectedHero”。...; 在属性指令页面中了解有关输入属性的更多信息。...hero属性是HeroDetailComponent类中唯一的东西。 它所做的就是通过其hero输入属性接收一个hero对象,然后绑定该属性到模板上。...就像您为内建的Angular指令所做的那样,通过将其列在元数据指令列表中,告诉Angular关于英雄详细信息组件。...前方的路 “The Tour of Heroes ”游戏的应用程序可以更多地使用共享组件,但其(模拟)数据仍然是在AppComponent中硬编码的。 这是不可持续的。
在“显示数据”页面中阅读有关插值的更多信息。 Hero对象 英雄需要更多的属性。 将英雄从文字字符串转换为类。 创建一个具有id和name属性的Hero类。...类中,将组件的英雄属性重构为Hero类型,然后将其id初始化为1,name为Windstorm。...', 刷新浏览器,页面将显示英雄名 组合HTML和多行模板字符串 要显示所有英雄的属性,请为英雄的id属性添加一个,并为英雄的名称添加另一个。...数据在两个方向流动:从属性到文本框,从文本框返回到属性。 在表单和模板语法页面中阅读有关ngModel的更多信息。 @Component(指令:...)...在下一个教程页面中,您将搭载“Tour of Heroes”应用程序,以显示英雄列表。
应用程序现在有了基本的标题。 接下来你要创建一个新的组件来显示英雄信息并且把这个组件放到应用程序的外壳里去。 创建英雄组件 使用 Angular CLI 创建一个名为 heroes 的新组件。...添加一个 hero 属性 往 HeroesComponent 中添加一个 hero 属性,用来表示一个名叫 “Windstorm” 的英雄。...创建一个 Hero 类 真实的英雄当然不仅仅只有一个名字。 在 src/app 文件夹中为 Hero 类创建一个文件,并添加 id 和 name 属性。...编辑英雄 用户应该能在一个 文本输入框(textbox)中编辑英雄的名字。 当用户输入时,这个输入框应该能同时显示和修改英雄的 name 属性。...你可以编辑英雄的名字,并且会看到这个改动立刻体现在这个输入框上方的 中。 声明 HeroesComponent 每个组件都必须声明在(且只能声明在)一个 NgModule 中。
如果名称未能匹配已知指令的元素事件或输出属性,则Angular会报告“未知指令”错误。 $event和事件处理语句 在事件绑定中,Angular为目标事件设置了一个事件处理程序。...模板语句有附作用 deleteHero方法有一个附作用:删除一个英雄。 模板语句的附作用不只是好的,但可预期。 删除英雄更新模型,可能会触发其他更改,包括查询并保存到远程服务器。...这些变化通过系统渗透,并最终显示在相关视图。 双向绑定([(…)]) 您经常希望显示数据属性,并在用户进行更改时更新该属性。 元素另一方面为元素更改事件组合设置特定元素属性和监听。...字符串“let hero of heroes”是指: 取英雄列表中的每个英雄,将其存储在本地英雄循环变量中,并使其可用于每次迭代的模板HTML。...模板输入变量 hero之前的let关键字创建一个名为hero的模板输入变量。 ngFor指令迭代由父组件的heroes属性返回的heroes,并在每次迭代期间将hero设置为列表中的当前项目。
此刻,HeroesComponent 同时显示了英雄列表和所选英雄的详情。 把所有特性都放在同一个组件中,将会使应用“长大”后变得不可维护。...你要把大型组件拆分成小一点的子组件,每个子组件都要集中精力处理某个特定的任务或工作流。 本页面中,你将迈出第一步 —— 把英雄详情移入一个独立的、可复用的 HeroDetailComponent。...这个组件所做的只是通过 hero 属性接收一个英雄对象,并显示它。 显示 HeroDetailComponent HeroesComponent 仍然是主从视图。...现在,当用户在列表中点击某个英雄时,selectedHero 就改变了。...像以前一样,一旦用户点击了一个英雄的名字,该英雄的详情就显示在了英雄列表下方。 现在,HeroDetailComponent 负责显示那些详情,而不再是 HeroesComponent。
随后,你将对你已经初始化的应用进行修改来让你构建出 Tour of Heroes app(英雄指南) 这个应用。 在教程的本部分,你需要完成下面的操作: 设置的你的环境。...设置你的环境 希望对你的开发环境进行设置,请参考下面的链接中的指南:Getting started: 先决条件 安装 Angular CLI 你不需要按照 Getting started 页面中说明的内容从头到尾的进行一次...每个项目都是一组由应用、库或端到端(e2e)测试组成的文件集合。 在本教程中,你将创建一个新的工作区。...希望创建一个新工作区并且初始一个应用项目,你需要: 确保你现在没有位于 Angular 工作区的文件夹中。...修改应用的标题 打开组件的类文件 (app.component.ts),并把 title 属性的值修改为 'Tour of Heroes' (英雄指南)。
领取专属 10元无门槛券
手把手带您无忧上云