J'essaie de créer de nouveaux observables basés sur deux autres. J'ai:Joindre deux observables dans RX.js
var mouseClickObservable = Rx.Observable.fromEvent(this.canvas, "click");
var mouseMoveObservable = Rx.Observable.fromEvent(this.canvas, "mousemove");
function findObject(x, y) {/* logic for finding object under cursor here. */}
var objectUnderCursor = this.mouseMoveObservable.select(function (ev) {
return findObject(ev.clientX, clientY);
});
Je veux créer objectClicked observable, qui devrait produire des valeurs lorsque l'utilisateur clique sur un objet. Je pourrais simplement appeler findObject à nouveau, comme ceci:
var objectClicked = this.mouseClickObservable.select(function (ev) {
return findObject(ev.clientX, clientY);
});
mais il est très fonction du temps.
Une autre façon, que j'utilise actuellement, est de stocker le dernier objet survolé dans une variable, mais je suppose qu'il devrait y avoir une manière purement fonctionnelle de le faire. J'ai essayé d'utiliser Observable.join comme ceci:
var objectClicked = this.objectUnderCursor.join(
mouseClickObservable,
function (obj) { return this.objectUnderCursor },
function (ev) { return Rx.Observable.empty() },
function (obj, ev) { return obj })
mais il produit plusieurs valeurs pour un seul clic
Oui, je dois savoir ce que la souris est en vol stationnaire, et votre dernière solution a été très utile, mais observable créé par '.selectMany (function() {return this.objectUnderCursor ;}) 'continuera à produire des valeurs lorsque la souris se déplace après le clic. Je l'ai changé en '.selectMany (function() {return this.objectUnderCursor.first();})' et cela fonctionne parfaitement. Merci beaucoup! –