bacon.js と FRP を理解しようとしているので、簡単なドラッグ アンド ドロップの例を作成しようとしましたが、1 つのコードの遅延評価に問題があります。をストリームに追加する.log()
と、見た目も動作も問題ないように見えますが、削除すると更新されません。これが私がやっていることです:
// UI streams
block_mousedown = block_el.asEventStream('mousedown').map(xyFromEvent);
global_mousemove = html.asEventStream('mousemove').map(xyFromEvent);
global_mouseup = html.asEventStream('mouseup');
// Composites
isDragging = block_mousedown.merge(global_mouseup.map(0));
mouseDragging = Bacon.combineAsArray(isDragging, global_mousemove)
.filter(function(v){ return notZero(v[0]) })
mouseDeltaFromClick = mouseDragging
.map(getDelta)
// Block offset when it was clicked on
block_pos_at_mousedown = block_mousedown
.map( function(a,b){ return block_el.offset();})
.map(function(e){ return [e.left, e.top]; })
// If I remove this log(), it doesn't evaluate
.log();
// merge mouse delta with block position when clicked
mouseDeltaAndBlockPos = mouseDeltaFromClick
.combine(block_pos_at_mousedown, '.concat')
.onValue( function(e){
block_el.css({
top : e[3]+e[1]+"px",
left : e[2]+e[0]+"px"
});
});
そして、ここにそれのjsFiddleがあります
私はこれについてすべて間違っているのではないかと考えていますが、これは正しいアプローチですか? クリックされたときにブロックの位置を通過したいのですが、更新する必要がmousedown
ありますが、mousemove
.