## 一、响应式编程
### 1、什么是响应式编程
响应式编程就是用异步数据流进行编程,这不是新理念。即使是最典型的点击事件也是一个异步事件流,从而可以对其进行侦测(observe)并进行相应操作。
可以基于任何东西创建数据流。流非常轻便,并且无处不在,任何东西都可以是一个流:用户输入、缓存、数据结构等等。例如,想象一下微博推文也可以是一个数据流,和点击事件一样。你可以对其进行侦听,并作相应反应。
使用响应式编程实现观察者模式。
观察者模式存在着被观察对象和观察者。
Angular中使用 RxJS 模块可以创建一个流对象,流对象就是一个被观察者。流对象可以被订阅,也就是被接收到。
为了测试流对象上面的一些方法,我们创建一个流对象。
### 2、流对象的方法
#### 2.1、创建接收流对象
```typescript
import { Observable } from "rxjs"
export class StreamComponent implements OnInit {
constructor() { }
ngOnInit() {
// 创建触发3次的流对象
let streamObj = Observable.from([1, 2, 3]);
// 订阅流对象(接收流对象)
streamObj.subscribe(data => {
console.log(data);
})
}
}
```
> Observable.from的参数由于是个数组,所以数组长度就是流对象触发的次数,在订阅的时候就会接收到所有的流对象。
#### 2.2、筛选流对象
流对象在接收之前可以进行筛选:
```typescript
streamObj
// 筛选接收到的数据为偶数的流对象,然后再进行接收
.filter(data => { return data % 2 == 0 })
.subscribe(data => {
console.log(data);
})
```
#### 2.3、对流对象进行二次运算
```typescript
streamObj
.filter(data => { return data % 2 == 0 })
// 对流对象进行+10后进行接收
.map(data => { return data + 10 })
.subscribe(data => {
console.log(data);
})
```
## 二、响应式表单
我们在使用百度搜索的时候,但我们输入一个关键词时,并没有回车就显示了搜索结果。
实现过程最容易想到的是绑定输入框,设定个延时,每次用户输入的时候,延时清零。当用户停止输入xxx毫秒时再进行请求数据。
其实这个功能使用流对象的方法很容易实现。使用流对象实现的方式就是响应式表单。
使用响应式表单需要在主模块app.module.ts中加入一个模块`ReactiveFormsModule`:
```js
imports: [
ReactiveFormsModule
],
```
我们在Home模块创建一个Input表单。
```html
```
在Home组件控制器中与Input表单绑定:
```typescript
import { FormControl } from '@angular/forms';
export class HomeComponent implements OnInit {
constructor() { }
ngOnInit() {
// 3、this.searchText.valueChanges是一个流对象,每当表单的值发生改变,就可以得到表单中的值。
this.searchText.valueChanges
.subscribe(data => {
console.log(data);
})
}
// 1、设置需要绑定的属性
searchText: FormControl = new FormControl();
}
```
```html
```
设置流对象订阅间隔:
```js
this.searchText.valueChanges
// 间隔500ms才订阅,如果流数据的触发间隔<500,后面的流数据会覆盖前面的流数据
.debounceTime(500)
.subscribe(data => {
console.log(data);
})
```
这样就可以使得每次用户输入的间隔>=500ms的时候才会向服务器请求数据,服务器压力更小,用户体验更好。