2016-12-21 12 views
1

Ich bin neu bei RxJS, also entschuldige ich mich für die Newbie Frage.RxJS beobachten ein Objekt

Ich habe ein lokales Javascript-Objekt wie folgt definiert:

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

ich jede Eigenschaft mit einem Eingangssteuer bin verbindlich, wenn der Benutzer die Werte ändern kann. Ich möchte in der Lage sein, dieses Objekt zu beobachten und das Ereignis zu erfassen, wenn sich der Wert einer der Eigenschaften ändert.

Ist das mit RxJS erreichbar?

Danke.

+1

Ist das, was Sie suchen? - https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/ofobjectchanges.md –

+0

Danke @OlesSavluk. Weißt du, ob das für verschachtelte Eigenschaften funktioniert? – dpdragnev

+0

Nicht sicher, unter der Haube verwendet es 'Object.observe'. Bedenken Sie auch, dass dies in den meisten Browsern nicht unterstützt wird. –

Antwort

4

Anstatt ein Objekt zu verwenden, können Sie Ihren gesamten Status als Observable speichern. Hier

ist das Beispiel-Code (etwas ähnlich zu dem, was die Menschen in redux tun):

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

Ich habe eine Frage, woher bekommst du die Variable "state"? Die eine, die Sie mit Object.assign() in beiden Observables – Borjante

+1

@ Borjante aktualisieren, wird von einer 'scan' Methode behandelt, beginnend mit' initialValue' und dann wird der nächste Zustand durch Anwenden der 'makeNew' Funktion auf den alten Zustand erzeugt. siehe - https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/scan.md –

Verwandte Themen