参考上一篇文章的步骤,重新把相关环境准备、目录结构走一遍。

这一次我们要开始创建真正的Angularjs项目了。

显示我们的英雄

我们要在应用中显示英雄数据

我们来为 AppComponent 添加两个属性: title 属性表示应用的名字,而 hero 属性表示一个名叫“ Windstorm ”的英雄。

export class AppComponent {
title = 'Tour of Heroes';
hero = 'Windstorm';
}

现在,我们为这些新属性建立数据绑定,以更新 @Component 装饰器中指定的模板

template: '<h1>{{title}}</h1><h2>{{hero}} details!</h2>'

Hero 对象

此时此刻,我们的英雄还只有一个名字。显然,它 / 她应该有更多属性。 让我们把 hero 从一个字符串字面量换成一个类。

创建一个 Hero 类,它具有 id 和 name 属性。 现在,把下列代码放在 app.component.ts 的顶部,仅次于 import 语句。

在app.component.ts中添加代码以创建Hero类。

export class Hero {
id: number;
name: string;
}

现在,有了一个 Hero 类,我们就要把组件 hero 属性的类型换成 Hero 了。 然后以 1 为 id 、以“ Windstorm ”为名字,初始化它。

在AppComponent类中添加:

hero: Hero = {
id: ,
name: 'Windstorm'
};

我们把 hero 从一个字符串换成了对象,所以也得更新模板中的绑定表达式,来引用 hero 的 name 属性。

template: '<h1>{{title}}</h1><h2>{{hero.name}} details!</h2>'

添加更多的 HTML

能显示名字虽然不错,但我们还想看到这位英雄的所有属性。 我们将添加一个 <div> 来显示英雄的 id 属性,用另一个 <div> 来显示英雄的 name 属性。

template: '<h1>{{title}}</h1><h2>{{hero.name}} details!</h2><div><label>id: </label>{{hero.id}}</div><div><label>name: </label>{{hero.name}}</div>'

多行模板字符串

我们可以通过字符串加法来制作更可读的模板,但这样仍然太难看了——难于阅读,容易拼错。 这样不行!我们要借助 ES2015 和 TypeScript 提供的模板字符串来保持清爽。

把模板的双引号改成反引号,并且让 <h1> , <h2> 和 <div> 标签各占一行。

template:` <h1>{{title}}</h1> <h2>{{hero.name}} details!</h2> <div><label>id: </label>{{hero.id}}</div> <div><label>name: </label>{{hero.name}}</div> `

编辑我们的英雄

我们想在一个文本框中编辑英雄的名字。

把英雄的名字从单纯的 <label> 重构成 <label> 和 <input> 元素的组合,就像下面这样:

template:`
<h1>{{title}}</h1>
<h2>{{hero.name}} details!</h2>
<div><label>id: </label>{{hero.id}}</div>
<div>
<label>name: </label>
<input value="{{hero.name}}" placeholder="name">
</div>
`

在浏览器中,我们看到英雄的名字显示成一个 <input> 文本框。但看起来还是有点不太对劲。 当修改名字时,我们的改动并没有反映到 <h2> 中。使用单向数据绑定,我们没法实现所期望的这种行为。

双向绑定

我们的期望是:在 <input> 中显示英雄的名字,修改它,并且在所有绑定到英雄名字的地方看到这些修改。 简而言之,我们需要双向数据绑定。

在我们让 表单输入 支持双向数据绑定之前,我们得先导入 FormsModule 模块。 只要把它添加到 NgModule 装饰器的 imports 数组中就可以了,该数组是应用中用到的外部模块列表。 这样我们就引入了表单包,其中包含了 ngModel 。

我们的模块app.module.ts就成了

import { NgModule }      from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { FormsModule } from '@angular/forms';
import { AppComponent } from './app.component';
@NgModule({
imports: [
BrowserModule,
FormsModule
],
declarations: [
AppComponent
],
bootstrap: [ AppComponent ]
})
export class AppModule { }

接下来更新模板,加入用于双向绑定的内置指令 ngModel 。

把 <input> 替换为下列 HTML

 <input [(ngModel)]="hero.name" placeholder="name"> 

浏览器刷新。又见到我们的英雄了。我们可以编辑英雄的名字,也能看到这个改动立刻体现在 <h2> 中。

好了,在终端中输入 npm start尽情浏览吧。

回顾一下我们刚才的操作;

我们从创建对象开始,再到在模板中显示对象的属性。以及双休绑定,关键字(ngModel),注意要写完整[(ngModel)].

AngularJs2 构建简单的英雄编辑器的更多相关文章

  1. 构建简单的 C++ 服务组件,第 1 部分: 服务组件体系结构 C++ API 简介

    构建简单的 C++ 服务组件,第 1 部分: 服务组件体系结构 C++ API 简介 熟悉将用于 Apache Tuscany SCA for C++ 的 API.您将通过本文了解该 API 的主要组 ...

  2. 基于slate构建文档编辑器

    基于slate构建文档编辑器 slate.js是一个完全可定制的框架,用于构建富文本编辑器,在这里我们使用slate.js构建专注于文档编辑的富文本编辑器. 描述 Github | Editor DE ...

  3. 使用webstorm+webpack构建简单入门级“HelloWorld”的应用&&引用jquery来实现alert

    使用webstorm+webpack构建简单入门级"HelloWorld"的应用&&构建使用jquery来实现 1.首先你自己把webstorm安装完成. 请参考这 ...

  4. 构建简单的Maven工程,使用测试驱动的方式开发项目

    构建简单的Maven工程很简单,这里写这篇随笔的原因是希望自己能记住几个小点. 一.安装Maven 1.下载maven:https://maven.apache.org/download.cgi 2. ...

  5. 【译】用boosting构建简单的目标分类器

    用boosting构建简单的目标分类器 原文 boosting提供了一个简单的框架,用来构建鲁棒性的目标检测算法.这里提供了必要的函数来实现它:100% MATLAB实现,作为教学工具希望让它简单易得 ...

  6. 三、使用Maven构建简单的java项目

    前边,我刚搭建了Maven环境,还有给大家推荐了学习资源,这个小节,我们来就来,,简单的玩玩maven. 1.所需工具: 1.Eclipse     2.apache-maven-3.3.9   3. ...

  7. Android 第三课 构建简单的用户界面

    构建简单的用户界面 上一课下一课 该课程教你 创建线性布局 添加文本框 添加字符串资源 添加按钮 使输入框宽度充满整个屏幕 你也应该阅读 布局 Android的图形用户界面通过 View 和 View ...

  8. Ant—使用Ant构建简单Java项目(三)

    博客<Ant-使用Ant构建简单Java项目(二)>我们简化了运行Test类中main方法须要运行的命令,本博客来介绍一下如何使build.xml文件和当中使用property标签定义的属 ...

  9. 学习笔记:Vue+Node+Mongodb 构建简单商城系统(二)

    前面几个月工作有点忙,导致构建简单商城系统的计划搁置近三个月.现在终于有时间重新回过头来继续本计划.本篇主要记录自己在阿里云服务器上搭建node运行环境的整个过程,以及对其中遇到的一些问题的思考. 一 ...

随机推荐

  1. C++ - 容器概述

    一 迭代器iterator 5种类别 常用的迭代器 常用的迭代器 二 分配算符Allocators 三 容器简介 STL标准容器类简介 标准容器类 说明 顺序性容器 关联容器 容器适配器 所有标准库共 ...

  2. MySQL GTID (二)

    MySQL GTID 系列之二 三.在线将GTID转化为传统模式 环境见上篇系列文章 关闭GTID,不用停止服务,不影响线上业务 3.1 关闭GTID复制,调整为传统复制 #SLVAE实例上停止复制 ...

  3. Cloudera Manger CDH 安装文档

    简介: Cloudera Manager 是 Cloudera 公司推出的 Hadoop 集群管理工具,通过该管理工具可以方便的部署.配置.监控集群. Cloudera 公司自己发布的 Hadoop ...

  4. css常用属性初总结:伪元素和伪元素

    前面几遍中我们分别说到了id选择器和class选择器,以及它们的区别和联系,下面大家一起来探究一下神奇的为类和伪元素吧. 其实以前我对伪类和伪元素也是搞得稀里糊涂的,现在决定剥开它神秘的外衣,首先,究 ...

  5. 磁盘512n,512e,4k原生磁盘的区别和操作系统支持

    磁盘按照物理扇区大小的不同分为三种512byte原生扇区硬盘(512n),4KB扇区仿真512byte(512E)磁盘,4kB扇区原生磁盘. 首先说物理扇区,扇区是硬盘上最小的读写单位,这个是硬盘决定 ...

  6. NOSQL之Redis、MongDB、Habase、Cassandra的介绍与比较

    一.Redis介绍     1.1Redis优点 (1)Redis拥有非常丰富的数据结构: (2)Redis提供事务的功能,可以保证一串命令的原子性,中间不会被任何打断. (3)数据存储在内存中,读写 ...

  7. __next__和__iter__实现迭代器协议

    ---恢复内容开始--- #_*_coding:utf-8_*_ __author__ = 'Linhaifeng' class Foo: def __init__(self,x): self.x=x ...

  8. Python爬虫进阶四之PySpider的用法

    审时度势 PySpider 是一个我个人认为非常方便并且功能强大的爬虫框架,支持多线程爬取.JS动态解析,提供了可操作界面.出错重试.定时爬取等等的功能,使用非常人性化. 本篇内容通过跟我做一个好玩的 ...

  9. [Java] 通过XPath获取XML中某个节点的属性

    /** * Get PA Url * @author jzhang6 * @return url */ public String getPAUrl(){ String PAUrl = "& ...

  10. 模板模式c#(非常简单,但又非常简洁好玩)

    using System;using System.Collections.Generic;using System.Linq;using System.Text; namespace 模板模式{   ...