前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >AngularDart4.0 英雄之旅-教程-04明细 顶

AngularDart4.0 英雄之旅-教程-04明细 顶

作者头像
南郭先生
发布于 2018-08-14 07:28:39
发布于 2018-08-14 07:28:39
3K00
代码可运行
举报
文章被收录于专栏:Google DartGoogle Dart
运行总次数:0
代码可运行

在此页面中,您将扩展“Tour of Heroes”应用程序,以显示英雄列表,并允许用户选择英雄并显示英雄的详细信息。

完成此页面后,该应用应该看起来像这个实例(查看源代码)。

必备条件

在继续本“英雄之旅”页面之前,请确认您在“英雄编辑器”页面之后具有以下结构。 如果您的结构不匹配,请返回该页面以弄清楚您错过了什么。

如果该应用尚未运行,请启动该应用。 当您进行更改时,请通过重新加载浏览器窗口来保持运行

应用程序重构

在添加新功能之前,您可以从应用程序重构中受益。

应用模板文件

您将对应用程序组件的模板进行多次更新。 首先,将模板移动到自己的文件中:

lib/app_component.html

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<h1>{{title}}</h1>
<h2>{{hero.name}} details!</h2>
<div><label>id: </label>{{hero.id}}</div>
<div>
  <label>name: </label>
  <input [(ngModel)]="hero.name" placeholder="name">
</div>

用指向新模板文件的templateUrl替换@Component模板:

lib/app_component.dart (metadata)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Component(
  selector: 'my-app',
  templateUrl: 'app_component.html',
  directives: const [formDirectives],
)

刷新浏览器。 该应用仍然继续运行。

Hero类

 分开使用并将Hero类从app_component.dart 中移动到它自己的文件中,创建lib/src文件夹来装Hero源文件:lib/src/hero.dart

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Hero {
  final int id;
  String name;

  Hero(this.id, this.name);
}

回到应用程序组件中,使用相对路径添加一个import 到新创建的文件:lib/app_component.dart (hero import)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import 'src/hero.dart';

刷新浏览器,程序将正常运行,现在添加新功能的准备工作就做好了。

展示英雄们

    显示一个英雄列表,首先需要将英雄们添加到视图模板

模拟英雄

    在lib / src下的以下文件中创建十个英雄的列表:lib/src/mock_heroes.dart

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import 'hero.dart';

final mockHeroes = <Hero>[
  new Hero(11, 'Mr. Nice'),
  new Hero(12, 'Narco'),
  new Hero(13, 'Bombasto'),
  new Hero(14, 'Celeritas'),
  new Hero(15, 'Magneta'),
  new Hero(16, 'RubberMan'),
  new Hero(17, 'Dynama'),
  new Hero(18, 'Dr IQ'),
  new Hero(19, 'Magma'),
  new Hero(20, 'Tornado')
];

最终这个应用程序将从Web服务获取英雄列表,但现在你可以显示模拟英雄。

应用hero字段

将hero字段替换为AppComponent中的公共heros字段,并使用模拟英雄进行初始化(不要忘记导入):lib/app_component.dart (heroes)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import 'src/mock_heroes.dart';

// ···
class AppComponent {
  final title = 'Tour of Heroes';
  List<Hero> heroes = mockHeroes;
  // ···
}

英雄数据与类实现分开,因为英雄名字最终将来自数据服务

 在模板中显示英雄名称

 要在无序列表中显示英雄名称,请将所有当前模板替换为以下HTML:lib/app_component.html (heroes template)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<h1>{{title}}</h1>
<h2>My Heroes</h2>
<ul class="heroes">
  <li>
    <!-- each hero goes here -->
  </li>
</ul>

下一步你将添加英雄名字

使用ngFor指令罗列英雄

目标是将组件中的英雄列表绑定到模板,迭代它们,并单独显示它们。通过添加核心指令* ngFor修改<li>标签。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<li *ngFor="let hero of heroes">

ngFor的前缀(*)是此语法的关键部分。 它表示<li>元素及其子元素构成一个主模板。 ngFor指令遍历组件的英雄列表并为该列表中的每个英雄呈现该模板的一个实例。 表达式部分将hero标识为模板输入变量,其中包含每个迭代的英雄详情。 你可以在模板中引用这个变量来访问当前英雄的属性。 在显示数据Showing a list property with *ngFor部分阅读更多关于ngFor和模板输入变量和模板语法页的ngFor部分

在<li>节点内添加内容hero模板变量来显示英雄属性 lib/app_component.html (ngFor)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<li *ngFor="let hero of heroes">
  <span class="badge">{{hero.id}}</span> {{hero.name}}
</li>

要在模板中使用Angular指令,需要在组件的@Component注解的指令参数中列出。 与您在第1部分中所做的相似,添加所有:CORE_DIRECTIVES:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CORE_DIRECTIVES = const [NgClass, NgFor, NgIf, NgTemplateOutlet, NgStyle, NgSwitch, NgSwitchWhen, NgSwitchDefault]

lib/app_component.dart (directives)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Component(
  selector: 'my-app',
  // ···
  directives: const [CORE_DIRECTIVES, formDirectives],
)

刷新浏览器,英雄列表将显示出来。

装饰英雄

用户应该得到一个他们徘徊和被选中英雄的视觉提示。要为组件添加样式,可以设置@Component注解的styles参数:lib/app_component.dart (styles)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// Not recommended when adding many CSS classes:
styles: const [
  '''
    .selected { ... }
    .heroes { ... }
    ...
  '''
],

但是,当添加多个样式时,这使得Dart文件更长,更不易读。 而应将样式放在.css文件中,并使用@Component的styleUrls参数引用该文件。 按照惯例,组件的CSS和Dart文件的名称具有相同的基础命名前缀(app_component)。lib/app_component.dart (stylUrls)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Component(
  selector: 'my-app',
  // ···
  styleUrls: const ['app_component.css'],
  // ···
)

lib/app_component.css

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
.selected {
  background-color: #CFD8DC !important;
  color: white;
}
.heroes {
  margin: 0 0 2em 0;
  list-style-type: none;
  padding: 0;
  width: 15em;
}
.heroes li {
  cursor: pointer;
  position: relative;
  left: 0;
  background-color: #EEE;
  margin: .5em;
  padding: .3em 0;
  height: 1.6em;
  border-radius: 4px;
}
.heroes li.selected:hover {
  color: white;
}
.heroes li:hover {
  color: #607D8B;
  background-color: #EEE;
  left: .1em;
}
.heroes .text {
  position: relative;
  top: -3px;
}
.heroes .badge {
  display: inline-block;
  font-size: small;
  color: white;
  padding: 0.8em 0.7em 0 0.7em;
  background-color: #607D8B;
  line-height: 1em;
  position: relative;
  left: -1px;
  top: -4px;
  height: 1.8em;
  margin-right: .8em;
  border-radius: 4px 0 0 4px;
}

将样式分配给组件时,它们的作用域为该特定组件。 这些样式仅适用于AppComponent,不影响外部HTML。

显示英雄的模板应该是这样的:lib/app_component.html (styled heroes)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<h2>My Heroes</h2>
<ul class="heroes">
  <li *ngFor="let hero of heroes">
    <span class="badge">{{hero.id}}</span> {{hero.name}}
  </li>
</ul>

选择一个英雄

该应用程序现在显示英雄列表,以及在详细信息视图中的单个英雄。 但是列表和细节视图没有连接。 当用户从列表中选择一个英雄时,选择的英雄应该出现在细节视图中。 这个UI模式被称为“主/细节”。在这种情况下,主人是英雄列表,细节是选择的英雄。

接下来,您将通过selectedHero组件属性将主链接到详细信息,该属性绑定到单击事件。

处理点击事件

添加点击事件绑定到<li>:lib/app_component.html (click)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<li *ngFor="let hero of heroes" (click)="onSelect(hero)">
  <span class="badge">{{hero.id}}</span> {{hero.name}}
</li>

圆括号将<li>元素的点击事件标识为目标。 onSelect(hero)表达式调用AppComponent方法onSelect(),传递模板输入变量hero作为参数。 这是你在ngFor指令中定义的同一个英雄变量。

用户输入页面和模板语法页面的事件绑定部分了解有关事件绑定的更多信息。

添加一个点击处理程序来显示选定的英雄 

你不再需要hero属性,因为你不再显示一个英雄; 你正在显示一个英雄列表。 但是用户可以通过点击选择一个英雄。 所以用这个简单的selectedHero属性来替换hero属性:lib/app_component.dart (selectedHero)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Hero selectedHero;

在用户选择英雄之前,所有的英雄名字都应该被取消选择,所以你不会像hero一样初始化selectedHero。添加一个onSelect()方法,将selectedHero属性设置为用户单击的英雄。lib/app_component.dart (onSelect)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void onSelect(Hero hero) => selectedHero = hero;

该模板仍然是指旧的英雄属性。 绑定到新的selectedHero属性,如下所示:lib/app_component.html (selectedHero details)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<h2>{{selectedHero.name}} details!</h2>
<div><label>id: </label>{{selectedHero.id}}</div>
<div>
  <label>name: </label>
  <input [(ngModel)]="selectedHero.name" placeholder="name">
</div>

使用ngIf指令隐藏空的对象

当应用程序加载时,selectedHero为null。 当用户点击英雄的名字时,所选择的英雄被初始化。 Angular无法显示null selectedHero的属性并抛出以下错误,在浏览器的控制台中可见:

EXCEPTION: TypeError: Cannot read property 'name' of undefined in [null]

尽管selectedHero.name显示在模板中,但必须保留DOM外的英雄详细信息,直到出现选定的英雄。用<div>包装模板的HTML英雄细节内容。 然后添加ngIf核心指令并将其设置为selectedHero!= null。lib/app_component.html (ngIf)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<div *ngIf="selectedHero != null">
  <h2>{{selectedHero.name}} details!</h2>
  <div><label>id: </label>{{selectedHero.id}}</div>
  <div>
    <label>name: </label>
    <input [(ngModel)]="selectedHero.name" placeholder="name">
  </div>
</div>

不要忘记ngIf前面的星号(*)。

刷新浏览器,该应用程序不再失败,名称列表再次显示在浏览器中。

当没有选定的英雄时,ngIf指令从DOM中移除英雄详情HTML。 没有英雄细节元素或绑定担心。

当用户选择一个英雄时,selectedHero变为非null,ngIf将英雄详细内容放入DOM中,并评估嵌套的绑定。

结构指令页面和模板语法页面的内置指令部分阅读有关ngIf和ngFor的更多信息。

格式化选中hero

当选择的英雄细节显示在列表下方时,很难在列表中识别选定的英雄。

在上面添加的样式元数据中,有一个名为selected的自定义CSS类。 为了让选定的英雄更清晰可见,当用户点击英雄名字时,你将把这个选定的class应用到<li>。 例如,当用户点击“Magneta”时,它应该用一个独特但微妙的背景颜色渲染,如下所示:

在模板中,将以下绑定添加到<li>标记中:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[class.selected]="hero === selectedHero"

当表达式(hero === selectedHero)为true时,Angular将添加所选的CSS类。 当表达式为false时,Angular删除选定的类。

===运算符测试给定的对象是否相同。 在模板语法指南中阅读有关[class]绑定的更多信息。

 <li>的最终版本如下所示:lib/app_component.html (ngFor with class.selected)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<li *ngFor="let hero of heroes"
    [class.selected]="hero === selectedHero"
    (click)="onSelect(hero)">
  <span class="badge">{{hero.id}}</span> {{hero.name}}
</li>

点击“Magneta”后,列表应该如下所示:

回顾应用程序结构

您的项目应该有以下文件:

教程组件测试 本教程不包括测试,但是如果您查看示例代码,则会为本教程添加的每个新功能进行组件测试。 详细信息请参阅组件测试页面。

你走过的路

以下是您在此页面中所取得的成果:

英雄之旅(Tour of Heroes)应用程序显示可选英雄列表。 您将应用程序模板移到了自己的文件中。 您将Hero类移到lib / src下的自己的文件中。 你增加了选择英雄和显示英雄的细节的能力。 您了解了如何在组件模板中使用核心指令ngIf和ngFor。 您在CSS文件中定义了样式,并使用它们来设置应用程序的样式。 你的应用应该看起来像这个实例(查看源代码)。

前方的路

你已经扩大了英雄之旅的应用程序,但它还远远没有完成。 一个应用程序不应该是一个单一的组件。 在下一页中,您将将应用程序拆分为子组件,并使它们一起工作。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017/10/24 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
卷积神经网络究竟做了什么?
神经学习的一种主要方式就是卷积神经网络(CNN),有许多种方法去描述CNN到底做了什么,一般通过图像分类例子通过数学的或直观的方法来介绍如何训练和使用CNN。
轻吻晴雯
2018/04/19
2.5K0
卷积神经网络究竟做了什么?
keras doc 6 卷积层Convolutional
本文摘自 http://keras-cn.readthedocs.io/en/latest/layers/convolutional_layer/
CreateAMind
2018/07/25
1.6K0
keras doc 6 卷积层Convolutional
【连载12】带你看懂最早的卷积神经网络LeNet-5
LeNet 诞生于 1994 年,是最早的卷积神经网络之一,并且推动了深度学习领域的发展
lujohn3li
2020/03/03
6970
深度学习算法中的卷积神经网络(Convolutional Neural Networks)
深度学习是近年来兴起的一种机器学习方法,它通过模拟人脑神经网络的结构和功能,实现对大规模数据进行高效处理和学习。卷积神经网络(Convolutional Neural Networks,简称CNN)是深度学习中最重要和最常用的算法之一,它在图像识别、计算机视觉和自然语言处理等领域取得了巨大的成功。
大盘鸡拌面
2023/09/19
5300
【连载13】详解CNN五大经典模型之一AlexNet
AlexNet在ILSVRC-2012的比赛中获得top5错误率15.3%的突破(第二名为26.2%),其原理来源于2012年Alex的论文《ImageNet Classification with Deep Convolutional Neural Networks》,这篇论文是深度学习火爆发展的一个里程碑和分水岭,加上硬件技术的发展,深度学习还会继续火下去。
lujohn3li
2020/03/03
7550
keras教程:卷积神经网络(CNNs)终极入门指南
本篇教程将会手把手教你使用keras搭建卷积神经网络(CNNs)。为了使你能够更快地搭建属于自己的模型,这里并不涉及有关CNNs的原理及数学公式,感兴趣的同学可以查阅《吊炸天的CNNs,这是我见过最详尽的图解!》 写在程序之前: 为了学习得更快,一些背景知识需要你了解 • 最常见的CNNs架构 上述模式,是一个最为常见的卷积网络架构模式。 如果上述链条理解起来比较吃力,你可以到这里恶补下基础知识。我们后面的代码,都是遵循上述模式来编写的。 • MNIST 数据集 在MN
AI传送门
2018/06/21
1.4K1
深度学习(六)keras常用函数学习 2018最新win10 安装tensorflow1.4(GPU/CPU)+cuda8.0+cudnn8.0-v6 + keras 安装CUDA失败 导入ten
原文链接:https://www.cnblogs.com/DOMLX/p/9769301.html
徐飞机
2018/10/11
2.2K0
教程 | 从基本概念到实现,全卷积网络实现更简洁的图像识别
选自 Medium 机器之心编译 参与:蒋思源、晏奇、黄小天 众所周知,图像就是像素值的集合,而这个观点可以帮助计算机科学家和研究者们构建一个和人类大脑相似并能实现特殊功能的神经网络。有时候,这种神经
机器之心
2018/05/07
9750
教程 | 从基本概念到实现,全卷积网络实现更简洁的图像识别
自制人脸数据,利用keras库训练人脸识别模型
机器学习最本质的地方就是基于海量数据统计的学习,说白了,机器学习其实就是在模拟人类儿童的学习行为。举一个简单的例子,成年人并没有主动教孩子学习语言,但随着孩子慢慢长大,自然而然就学会了说话。那么孩子们是怎么学会的呢?很简单,在人类出生之前,有了听觉开始,就开始不断听到各种声音。人类的大脑会自动组织、分类这些不同的声音,形成自己的认识。随着时间的推移,大脑接收到的声音数据越来越多。最终,大脑利用一种我们目前尚未知晓的机制建立了一个成熟、可靠的声音分类模型,于是孩子们学会了说话。机器学习也是如此,要想识别出这张人脸属于谁,我们同样需要大量的本人和其他人的人脸数据,然后将这些数据输入Tensorflow这样的深度学习(深度学习指的是深度神经网络学习,乃机器学习分支之一)框架,利用深度学习框架建立属于我们自己的人脸分类模型。只要数据量足够,分类准确率就能提高到足以满足我们需求的级别。
机器学习AI算法工程
2019/10/29
3.4K0
自制人脸数据,利用keras库训练人脸识别模型
越来越卷,教你使用Python实现卷积神经网络(CNN)
https://blog.csdn.net/weixin_44510615/article/details/117409037
润森
2022/09/22
2.7K0
越来越卷,教你使用Python实现卷积神经网络(CNN)
基于卷积神经网络的图像情感分析模型,Python实现
图片情感分析,重点是颜色特征的提取,将每一个像素点的颜色特征转换成一个值,最终效果是把一个图片转换成一个二维矩阵,矩阵中每一个值都代表该像素点的颜色特征。概括来说就是将每个像素点的RGB值转换为HSV,然后对HSV三个值进行加权求和,得出一个值来表示颜色特征,RGB值转换为HSV有标准公式,对HSV三个值进行加权求和时权值的选择参考自一篇对服装图像进行分类的论文。具体过程如下:
机器学习AI算法工程
2019/10/28
1.7K0
基于卷积神经网络的图像情感分析模型,Python实现
卷积神经网络学习路线(六)| 经典网络回顾之LeNet
开篇的这张图代表ILSVRC历年的Top-5错误率,我会按照以上经典网络出现的时间顺序对他们进行介绍,同时穿插一些其他的经典CNN网络。
BBuf
2019/12/23
6700
Deep learning基于theano的keras学习笔记(3)-网络层
1.3 Dropout层 为输入数据施加Dropout。Dropout将在训练过程中每次更新参数时随机断开一定百分比(p)的输入神经元连接,Dropout层用于防止过拟合。
李智
2018/08/03
1.2K0
使用CNN卷积神经网络模型训练mnist数据集
卷积操作就是卷积核(kernal)跟输入数据每个值相乘再加起来得到的一个值作为输出
yichen
2021/03/10
1.1K0
带你一文搞懂CNN以及图像识别(Python)
卷积神经网络(Convolution Neural Networks,CNN)是一类包含卷积计算的前馈神经网络,是基于图像任务的平移不变性(图像识别的对象在不同位置有相同的含义)设计的,擅长应用于图像处理等任务。在图像处理中,图像数据具有非常高的维数(高维的RGB矩阵表示),因此训练一个标准的前馈网络来识别图像将需要成千上万的输入神经元,除了显而易见的高计算量,还可能导致许多与神经网络中的维数灾难相关的问题。
JOYCE_Leo16
2024/03/19
1.1K0
带你一文搞懂CNN以及图像识别(Python)
快乐学AI系列——计算机视觉(4.篇外)什么是“卷积神经网络”
卷积神经网络(Convolutional Neural Network,CNN)是一种深度学习算法,常用于计算机视觉领域的图像分类、目标检测和图像分割任务中。它的核心思想是通过卷积运算从原始数据中提取特征,然后将这些特征传递给全连接层进行分类或回归。
MATRIX.矩阵之芯
2023/04/05
4050
快乐学AI系列——计算机视觉(4.篇外)什么是“卷积神经网络”
卷积神经网络VGG16这么简单,为什么没人能说清?
很多人想入门做深度学习,但往往翻遍网络看完一篇又一篇所谓的“入门教程”,paper,包括很多深度学习框架官方给出的案例,给人的感觉真的是从入门到放弃。写教程的作者有很多都是技术大神,但写出的东西真的是把原本简简单单的理论说得晦涩难懂,模凌两可。比如说VGG16,都是摆上从论文里截过来的下面这张图:
机器学习AI算法工程
2019/10/28
2.4K0
卷积神经网络VGG16这么简单,为什么没人能说清?
Python人工智能 | 十八.Keras搭建卷积神经网络及CNN原理详解
从本专栏开始,作者正式研究Python深度学习、神经网络及人工智能相关知识。前一篇文章详细讲解了Keras实现分类学习,以MNIST数字图片为例进行讲解。本篇文章详细讲解了卷积神经网络CNN原理,并通过Keras编写CNN实现了MNIST分类学习案例。基础性文章,希望对您有所帮助!
Eastmount
2022/11/25
1.5K0
对比学习用 Keras 搭建 CNN RNN 等常用神经网络
参考: 各模型完整代码 周莫烦的教学网站 这个网站上有很多机器学习相关的教学视频,推荐上去学习学习。 Keras 是一个兼容 Theano 和 Tensorflow 的神经网络高级包, 用他来组件一个神经网络更加快速, 几条语句就搞定了. 而且广泛的兼容性能使 Keras 在 Windows 和 MacOS 或者 Linux 上运行无阻碍. 今天来对比学习一下用 Keras 搭建下面几个常用神经网络: 回归 RNN回归 分类 CNN分类 RNN分类 自编码分类 它们的步骤差不多是一样的: [导入模块
杨熹
2018/04/02
1.7K0
对比学习用 Keras 搭建 CNN RNN 等常用神经网络
手把手搭建一个【卷积神经网络】
本文介绍卷积神经网络的入门案例,通过搭建和训练一个模型,来对10种常见的物体进行识别分类;使用到CIFAR10数据集,它包含10 类,即:“飞机”,“汽车”,“鸟”,“猫”,“鹿”, “狗”,“青蛙”,“马”,“船”,“卡车” ;共 60000 张彩色图片;通过搭建和训练卷积神经网络模型,对图像进行分类,能识别出图像是“汽车”,或“鸟”,还是其它。
一颗小树x
2021/05/12
1.4K0
手把手搭建一个【卷积神经网络】
推荐阅读
相关推荐
卷积神经网络究竟做了什么?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验