2016-12-21 13 views
1

私はRxJSを初めて使っていますので、初心者の質問には謝ります。RxJSはオブジェクトを観察します

ように私は定義されたローカルのJavaScriptオブジェクトを持っている:私は、ユーザが値を変更することができ、入力コントロールに各プロパティを結合してい

model.user = { 
 
    firstName: 'John', 
 
    lastName: 'Smith' 
 
}

。私はこのオブジェクトを観察し、プロパティの値が変化したときにイベントをキャプチャしたいと考えています。

これはRxJSで達成できますか?

ありがとうございました。

+1

は、あなたが探しているものを、このですか? - https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/ofobjectchanges.md –

+0

@OlesSavlukありがとうございます。ネストされたプロパティでこれが機能するかどうかを知っていますか? – dpdragnev

+0

確かに、フードの下には 'Object.observe'が使われています。また、ほとんどのブラウザではサポートされていないことに注意してください。 –

答えて

4

オブジェクトを使用する代わりに、状態全体をObservableとして保存することができます。ここで

は、サンプルコード(人々はReduxの中で何に似たもの)である:

var fnameInput = document.getElementById('fname'); 
 
var lnameInput = document.getElementById('lname'); 
 
var jsonPre = document.getElementById('json'); 
 

 
var onFirstName$ = Rx.Observable.fromEvent(fnameInput, 'input'); 
 
var onLastName$ = Rx.Observable.fromEvent(lnameInput, 'input'); 
 

 
var initialState = { 
 
    firstName: '', 
 
    lastName: '', 
 
}; 
 

 
var state$ = Rx.Observable 
 
    .merge(
 
    onFirstName$ 
 
     .map(e => 
 
     state => Object.assign(
 
      state, 
 
      { firstName: e.target.value } 
 
     ) 
 
    ), 
 
    onLastName$ 
 
     .map(e => 
 
     state => Object.assign(
 
      state, 
 
      { lastName: e.target.value } 
 
     ) 
 
    ) 
 
) 
 
    .scan(
 
    (state, makeNew) => makeNew(state), 
 
    initialState 
 
) 
 
    .startWith(initialState); 
 

 
state$ 
 
    .subscribe(state => { 
 
    jsonPre.innerHTML = JSON.stringify(state, null, 2); 
 
    });
<input id="fname" type="text"> 
 
<input id="lname" type="text"> 
 
<pre id="json"></pre> 
 

 
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/4.0.6/rx.all.js"></script>

+0

私は1つの質問を得ました。変数 "state"はどこから得られますか?オブジェクトObservablesの両方でObject.assign()で更新するもの – Borjante

+1

@Borjante 'initial'から始まる' scan'メソッドによって処理され、 'makeNew'関数を古い状態に適用することによって次の状態が作成されます。 - https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/scan.md –

関連する問題