點燈坊

失くすものさえない今が強くなるチャンスよ

如何讓 RxJS 只處理 Number ?

Sam Xiao's Avatar 2020-06-29

DOM 要配合 RxJS,直覺都會使用 v-stream 配合 DOM Event,事實上也能使用 watchAsObservable() 朝 data 下手。

Version

macOS Catalina 10.15.4
WebStorm 2020.1
Vue 2.6.11
RxJS 6.5.5

V-model

number000

只有 Number 才會寫入 message data,String 不會。

<template>
  <div>
    <input type="text" v-model.number="message">
    {{ message }}
  </div>
</template>

<script>
export default {
  name: 'app',
  data: () => ({
    message: ''
  })
}
</script>

第 3 行

<input type="text" v-model.number="message">

只要在 v-model 加上 number modifier,Vue 只會讓 Number 進入 data。

RxJS

<template>
  <div>
    <input type="text" v-model.number="message">
    {{ output$ }}
  </div>
</template>

<script>
import { pluck } from 'rxjs/operators'

let subscriptions = function() {
  let output$ = this.$watchAsObservable('message').pipe(
    pluck('newValue')
  )

  return { output$ }
}

export default {
  name: 'app',
  data: () => ({
    message: ''
  }),
  subscriptions
}
</script>

12 行

let output$ = this.$watchAsObservable('message').pipe(
  pluck('newValue')
)

v-model.number 雖然好用,但要如何配合 RxJS 呢 ?

使用 this.$watchAsObservable() 將 data 轉成 Observable,就可繼續使用 RxJS 了。

Conclusion

  • v-model.number 讓 data 只接受 Number,RxJS 可透過 watchAsObservable() 繼續使用此好用特性

Reference

Vue, Form Input Bindings
Vue-rx, $watchAsObservable()