RxJS 學(xué)習(xí)系列 RxJS 在 Angular 中的使用

響應(yīng)式表單

FormControlvalueChanges 屬性和 statusChanges 屬性包含了會發(fā)出變更事件的可觀察對象。
例子

import { Component, OnInit } from '@angular/core';
import { FormBuilder, FormGroup, Validators, FormControl, AbstractControl } from '@angular/forms';
import { concat, merge, zip, combineLatest, race } from 'rxjs/index';
import { filter, map, startWith,  } from 'rxjs/internal/operators';

@Component({
  selector: 'my-app',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent implements OnInit {
  form: FormGroup;
  constructor(
    private formBuilder: FormBuilder,
  ) { }

  ngOnInit() {
    this.form = this.formBuilder.group({
      username: ['', Validators.required],
      hobby: [''],
    });

    //  監(jiān)聽整個表單
    this.form.valueChanges
          .subscribe( res => console.log(res));
  }
}

HTML

<form [formGroup]="form">
    username: <input type="text" name="username" formControlName="username">
    hobby: 
      <select name="hobby">
        <option value="sleep">sleep</option>
        <option value="play">play</option>
      </select>    
</form>

完善驗證,只有通過驗證才輸出內(nèi)容 filter 是rxjs提供的運算符

    this.form.valueChanges
    .pipe(
      filter(() => this.form.valid)
    )
    .subscribe(res => console.log(res));

如果需要額外的邏輯,只需要在pipe添加相應(yīng)的運算符谤专。比如這里在結(jié)果里追加上次更新時間,字段名為lastTime

    this.form.valueChanges
    .pipe(
      filter(() => this.form.valid),
      map(data => {
        data.lastTime = new Date();
        return data
     })
    )
    .subscribe(res => console.log(res));

另一種寫法怠噪,監(jiān)聽各個元素

    // 如果要監(jiān)聽單個表單元素
    const username$ = this.form.get('username').pipe(startWith(this.form.get('username').value))
    const hobby$ = this.form.get('hobby').pipe(startWith(this.form.get('hobby').value))
    //  combineLatest,它會取得各個 observable 最后送出的值杜跷,再輸出成一個值
    //  這個有個問題是只有合并的元素都產(chǎn)生值才會輸出內(nèi)容傍念,所以在上面使用startWith賦初始化值
    combineLatest(username$, status$)
      .pipe(
        map(([username, status]) => ({username, status}))
      )
      .subscribe(res => console.log(res));

結(jié)合返回Observable的組件 Angular Material

Angular Material 是基于Angular的前端框架,國外使用度高葛闷。
他提供的組件有些方法返回的是Observable憋槐,比如Dialog的afterAllClosed,SnackBar的afterOpened, afterDismissed
比如某需要孵运,提示消失1s后跳轉(zhuǎn)頁面
優(yōu)化前的代碼:

this.snackbar.success(response);
setTimeout(function () {
    this.router.navigate([`/login`]);
}, 1000);

優(yōu)化后的代碼:

import { delay } from 'rxjs/operators';
...
this.snack.success(response).afterDismissed()
  .pipe(delay(1000))
  .subscribe(() => {
    this.router.navigate([`/login`]);
  });
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末秦陋,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子治笨,更是在濱河造成了極大的恐慌驳概,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件旷赖,死亡現(xiàn)場離奇詭異顺又,居然都是意外死亡,警方通過查閱死者的電腦和手機等孵,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進店門稚照,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事果录∩险恚” “怎么了?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵弱恒,是天一觀的道長辨萍。 經(jīng)常有香客問我,道長返弹,這世上最難降的妖魔是什么锈玉? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮义起,結(jié)果婚禮上拉背,老公的妹妹穿的比我還像新娘。我一直安慰自己默终,他們只是感情好椅棺,可當我...
    茶點故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著穷蛹,像睡著了一般土陪。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上肴熏,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天鬼雀,我揣著相機與錄音,去河邊找鬼蛙吏。 笑死源哩,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的鸦做。 我是一名探鬼主播励烦,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼泼诱!你這毒婦竟也來了坛掠?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤治筒,失蹤者是張志新(化名)和其女友劉穎屉栓,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體耸袜,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡友多,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了堤框。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片域滥。...
    茶點故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡纵柿,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出启绰,到底是詐尸還是另有隱情昂儒,我是刑警寧澤,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布委可,位于F島的核電站荆忍,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏撤缴。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一叽唱、第九天 我趴在偏房一處隱蔽的房頂上張望屈呕。 院中可真熱鬧,春花似錦棺亭、人聲如沸虎眨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽嗽桩。三九已至,卻和暖如春凄敢,著一層夾襖步出監(jiān)牢的瞬間碌冶,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工涝缝, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留扑庞,地道東北人。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓拒逮,卻偏偏與公主長得像罐氨,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子滩援,可洞房花燭夜當晚...
    茶點故事閱讀 44,864評論 2 354

推薦閱讀更多精彩內(nèi)容