课题

  1. 程序界面由3个文本编辑框和1个文本标签组成。
  2. 要求文本标签实时显示3个文本编辑框所输入的数字之和。
  3. 文本编辑框输入的不是合法数字时,将其值视为0。
  4. 3个文本编辑框的初值分别为1,2,3。

创建工程

# 安装 Angular CLI
$ npm install -g @angular/cli
# 创建新的应用程序 RxExample
$ ng new RxExample
$ cd RxExample
$ npm audit fix --force

打开 Intellij IDEA, File / New / Project From Existing Sources...,然后选中工程所在文件夹

在向导的第1页选择 Create project from existing sources

完成向导后在点击 Finish 创建工程。

点击 Add Configurations, 点击 +npm

Name: Angular CLI Server

Scripts: start

点击 OK 完成配置。

点击 Angular CLI Server 启动程序。

http://localhost:4200/ 可打开网页。

CSS

打开 app.component.css 文件,将其改为

.number {
width: 50px;
text-align: right;
}

不使用 RxJS 的解决方案

app.module.ts 中添加 FormsModule 的引用。

import { FormsModule } from '@angular/forms';

@NgModule({
imports: [
BrowserModule,
FormsModule,
],
})

打开 app.component.html 文件,将其改为

<div style="text-align:center">
<h1>
Welcome to {{ title }}!
</h1>
</div>
<p>
<input class="number" [(ngModel)]="number1" (ngModelChange)="onChangeNumber()"> +
<input class="number" [(ngModel)]="number2" (ngModelChange)="onChangeNumber()"> +
<input class="number" [(ngModel)]="number3" (ngModelChange)="onChangeNumber()"> =
<label>{{result}}</label>
</p>

打开 app.component.ts 文件,将其改为

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

@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent implements AfterViewInit { number1 = '1';
number2 = '2';
number3 = '3';
result: string; title = 'RxExample';
constructor() { } ngAfterViewInit() {
this.onChangeNumber();
} onChangeNumber() {
const g = s => Number(s) || 0;
setTimeout(() => this.result = String(g(this.number1) + g(this.number2) + g(this.number3)));
}
}

使用 RxJS 的解决方案

打开 app.component.html 文件,将其改为

<div style="text-align:center">
<h1>
Welcome to {{ title }}!
</h1>
</div>
<p>
<input #number1Ref class="number" value="1"> +
<input #number2Ref class="number" value="2"> +
<input #number3Ref class="number" value="3"> =
<label>{{resultAsync | async}}</label>
</p>

打开 app.component.ts 文件,将其改为

import { Component, ElementRef, ViewChild, AfterViewInit } from '@angular/core';
import { combineLatest, fromEvent, Observable } from 'rxjs';
import { map, pluck, startWith } from 'rxjs/operators'; @Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent implements AfterViewInit { @ViewChild('number1Ref') number1Ref: ElementRef;
@ViewChild('number2Ref') number2Ref: ElementRef;
@ViewChild('number3Ref') number3Ref: ElementRef;
resultAsync: Observable<string>; title = 'RxExample';
constructor() { } ngAfterViewInit() {
const f = elemRef => fromEvent(elemRef.nativeElement, 'input')
.pipe(pluck('target', 'value'), startWith((elemRef.nativeElement as HTMLInputElement).value));
const g = s => Number(s) || 0;
setTimeout(() => this.resultAsync = combineLatest(f(this.number1Ref), f(this.number2Ref), f(this.number3Ref))
.pipe(map(results => String(g(results[0]) + g(results[1]) + g(results[2])))));
}
}

ReactiveX 学习笔记(22)使用 RxJS + Angular 进行 GUI 编程的更多相关文章

  1. ReactiveX 学习笔记(0)学习资源

    ReactiveX 学习笔记 ReactiveX 学习笔记(1) ReactiveX 学习笔记(2)创建数据流 ReactiveX 学习笔记(3)转换数据流 ReactiveX 学习笔记(4)过滤数据 ...

  2. Ext.Net学习笔记22:Ext.Net Tree 用法详解

    Ext.Net学习笔记22:Ext.Net Tree 用法详解 上面的图片是一个简单的树,使用Ext.Net来创建这样的树结构非常简单,代码如下: <ext:TreePanel runat=&q ...

  3. SQL反模式学习笔记22 伪键洁癖,整理数据

    目标:整理数据,使不连续的主键Id数据记录变的连续. 反模式:填充断档的数据空缺. 1.不按照顺序分配编号 在插入新行时,通过遍历表,找到的第一个未分配的主键编号分配给新行,来代替原来自动分配的伪主键 ...

  4. Hadoop学习笔记—22.Hadoop2.x环境搭建与配置

    自从2015年花了2个多月时间把Hadoop1.x的学习教程学习了一遍,对Hadoop这个神奇的小象有了一个初步的了解,还对每次学习的内容进行了总结,也形成了我的一个博文系列<Hadoop学习笔 ...

  5. [原创]java WEB学习笔记22:MVC案例完整实践(part 3)---多个请求对应一个Servlet解析

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  6. ‎Cocos2d-x 学习笔记(22) TableView

    [Cocos2d-x 学习笔记 ]目录 1. 简介 TableView直接继承了ScrollView和ScrollViewDelegate.说明TableView能实现ScrollView拖动cont ...

  7. 学习笔记(一)--->《Java 8编程官方参考教程(第9版).pdf》:第一章到六章学习笔记

    注:本文声明事项. 本博文整理者:刘军 本博文出自于: <Java8 编程官方参考教程>一书 声明:1:转载请标注出处.本文不得作为商业活动.违者本人不负法律责任.违法者自负一切法律责任. ...

  8. [原创]java WEB学习笔记27:深入理解面向接口编程

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  9. ReactiveX 学习笔记(18)使用 RxJS + Angular 调用 REST API

    JSON : Placeholder JSON : Placeholder (https://jsonplaceholder.typicode.com/) 是一个用于测试的 REST API 网站. ...

随机推荐

  1. Fibonacci Heaps

    Mergeable heapsA mergeable heap is any data structure that supports the following five operations,in ...

  2. linux 内存使用情况详解

    一:首先是先登录 二:查看当前目录 命令:df -h 三:查看具体文件夹占用情况 命令:du --max-depth=1 -h  /data/ 或者:为了快算显示,同时也只是想查看目录整体占用大小 命 ...

  3. 利用教育邮箱注册JetBrains产品(pycharm、idea等)的方法

    转载:http://www.cnblogs.com/wang-meng/p/8887436.html 1,申请邮箱   地址为:http://mdu.edu.rs/  邮箱的前缀可以改成自己喜欢的字符 ...

  4. 本地代码上传到githup

    1.githup网站创建new repository 2.执行下面命令,找到本地用户公钥地址 ssh -v git@github.com 输出: debug1: Offering RSA public ...

  5. 《JavaScript 设计模式与开发实战》第一部分(1、2、3章)笔记

    第1章:面向对象的JavaScript 动态类型和鸭子类型 编程语言按照数据类型大体可以分为两类: ① 静态类型语言:在编译时便已确定变量的类型. ② 动态类型语言:变量类型要到程序运行的时候,待变量 ...

  6. CentOS磁盘满了,导致磁盘无法写入,这么清理

    输入命令 du -sh /* | sort -nr 会列出根目录文件夹的大小 看到哪个文件夹比较大 删除相应的缓存,重启服务器即可

  7. APPlication,Session和Cookie的区别

    方法 信息量大小 保存时间 应用范围 保存位置 Application 任意大小 整个应用程序的生命期 所有用户 服务器端 Session 小量,简单的数据 用户活动时间+一段延迟时间(一般为20分钟 ...

  8. docker lamp

    可以直接使用官方镜像搭建LAMP环境从官方下载PHP+Apache镜像和MySQL两个镜像来组成(如:php:7.2.3-apache-stretch和mysql:5.7.21)docker pull ...

  9. postgresql jdbc 连接数据库测试

    转载自:http://blog.csdn.net/southflow/article/details/5944107 1. 下载postgresql-8.4-702.jdbc4.jar  2. 点击 ...

  10. 5、在Dreamweaver cc 2017中添加服务器扩展组件

    Adobe DW CC 2015对HTML5.CSS3.jQuery.jQuery UI都有很好的支持,无奈这个版本却未提供开发动态网站所需要的服务器行为面板.数据库面板以及绑定面板等.要添加这个面板 ...