2015-12-30 1 views
3

Je suis assez nouveau pour le concept de programmation réactive, et je ne fais que jouer un peu. Pour mettre en pratique ce que j'ai appris, j'ai décidé d'écrire du code en utilisant RxJS dans un projet réel et tout va bien.Créer un bouton à bascule avec RxJS

Maintenant, je veux créer un simple bouton à bascule:

let btn = $('button')[0] 
let clicks = Rx.Observable.fromEvent(btn, 'click') 
       .map(function(clickEvent) { 
        // decide to return true/false 
       }) 

clicks.subscribe(value => { 
    // value is true or false 
}) 

Je ne peux pas obtenir ma tête autour de cet exercice très simple sans utiliser des méthodes DOM dans mon flux. En fait, j'ai juste besoin de la dernière valeur du flux, puis je l'inverse (valeur !!);

Comment puis-je l'implémenter?

Répondre

3

Est-ce que votre bouton ne porte l'état que via le DOM? Dans ce cas, il sera impossible de récupérer cet état sans interroger le DOM.

Vous pouvez envisager d'avoir votre état hors du DOM et de le manipuler sans les fonctions DOM. Cela dit, vous aurez à un moment donné à mettre à jour l'état DOM, mais que vous pouvez faire hors du flux dans l'observateur.

Quelque chose comme ceci:

var button_initial_state = false; // false for unchecked 

var button_state$ = Rx.Observable.fromEvent(btn, 'click') 
           .scan (function(current_state, event){ 
            return !current_state; 
            }, button_initial_state) 
           .startWith(button_initial_state); 

button_state$.subscribe (function (state){ 
    // Code to set the button state in the DOM 
}) 

La documentation pertinente:

+0

Cool, merci! C'est pourquoi je ne pouvais pas comprendre :). Je vais jeter un coup d'oeil à la numérisation. – codeorelse

+0

Cela donne une erreur dans la cour RxVision: 'TypeError: accumulateur est pas un function' – codeorelse

+0

mmhh puis essayez' .scan ({! retour current_state;} button_initial_state, fonction (current_state, événement)) '. Le problème est que la signature de la fonction est différente selon la version de Rxj que vous utilisez. Dans un cas, la graine est le premier argument, dans l'autre, la graine est la dernière. Je ne sais pas quelle version utilise RxVision, donc vérifiez les deux possibilités – user3743222