使用 RxJS Observable 在拖动事件上更改 css class
Using RxJS Observable to change css class on drag events
嗨,我的目标是使用 Observable 序列来监听 dragEnter/dragleave 事件来改变 css classes。即:
var myDraggableListEl = document.querySelector....
var itemDragIn$ = Rx.Observable.fromEvent(myDraggableListEl, 'dragenter').map((e)=> e.target);
var itemDragOut$ = Rx.Observable.fromEvent(myDraggableListEl, 'dragleave').map((e)=> e.target);
基本上我只想在 'dragenter' 上添加一个 'hover' class,然后在 dragleave 上删除相同的 class。
我想知道是否有一种聪明的方法来 'merge' 这两个,这样订阅就可以像这样:
.subscribe( (boolAdd, className, target ) => {
boolAdd ? target.classlist.add(className): target.classlist.remove(className)
}
也许我只是想多了,我只是将两个可观察对象分开,但只是想知道是否有人已经完成了这个或者他们是否有更好的方法。
谢谢!
您完全可以使用 Rx.Observable.merge()
方法做到这一点。
链接:
示例(这里是 Fiddle):
Rx.Observable.merge(
Rx.Observable.fromEvent($el, 'dragenter').map(function(e) {
return { target: e.target, isAdd: true, className: 'dragg' }
}),
Rx.Observable.fromEvent($el, 'dragleave').map(function(e) {
return { target: e.target, isAdd: false, className: 'dragg' }
}))
.subscribe(function(obj){
if(obj.isAdd) {
obj.target.classlist.add(obj.className);
} else {
obj.target.classlist.remove(obj.className);
}
});
尽管请考虑以下内容可能更具可读性:
// addClass and removeClass are defined somewhere (can represent jquery's functions)
Rx.Observable
.fromEvent($el, 'dragenter')
.subscribe(function(e){
addClass(e.target, 'dragg');
});
Rx.Observable
.fromEvent($el, 'dragleave')
.subscribe(function(e){
removeClass(e.target, 'dragg');
});
嗨,我的目标是使用 Observable 序列来监听 dragEnter/dragleave 事件来改变 css classes。即:
var myDraggableListEl = document.querySelector....
var itemDragIn$ = Rx.Observable.fromEvent(myDraggableListEl, 'dragenter').map((e)=> e.target);
var itemDragOut$ = Rx.Observable.fromEvent(myDraggableListEl, 'dragleave').map((e)=> e.target);
基本上我只想在 'dragenter' 上添加一个 'hover' class,然后在 dragleave 上删除相同的 class。
我想知道是否有一种聪明的方法来 'merge' 这两个,这样订阅就可以像这样:
.subscribe( (boolAdd, className, target ) => {
boolAdd ? target.classlist.add(className): target.classlist.remove(className)
}
也许我只是想多了,我只是将两个可观察对象分开,但只是想知道是否有人已经完成了这个或者他们是否有更好的方法。 谢谢!
您完全可以使用 Rx.Observable.merge()
方法做到这一点。
链接:
示例(这里是 Fiddle):
Rx.Observable.merge(
Rx.Observable.fromEvent($el, 'dragenter').map(function(e) {
return { target: e.target, isAdd: true, className: 'dragg' }
}),
Rx.Observable.fromEvent($el, 'dragleave').map(function(e) {
return { target: e.target, isAdd: false, className: 'dragg' }
}))
.subscribe(function(obj){
if(obj.isAdd) {
obj.target.classlist.add(obj.className);
} else {
obj.target.classlist.remove(obj.className);
}
});
尽管请考虑以下内容可能更具可读性:
// addClass and removeClass are defined somewhere (can represent jquery's functions)
Rx.Observable
.fromEvent($el, 'dragenter')
.subscribe(function(e){
addClass(e.target, 'dragg');
});
Rx.Observable
.fromEvent($el, 'dragleave')
.subscribe(function(e){
removeClass(e.target, 'dragg');
});