angular – 我可以用其他鼠标事件运行@Hostlistner吗?
发布时间:2020-12-17 17:09:49 所属栏目:安全 来源:网络整理
导读:为了避免设置一个无用的监听器,我想只在运行mousedown事件时启动mousemove监听器.像这样的东西: 在我的组件里面 private startMouseMove(start: boolean){ if(start){ @HostListener('mousemove',['$event']) onMouseMove(event: MouseEvent){ console.log(
|
为了避免设置一个无用的监听器,我想只在运行mousedown事件时启动mousemove监听器.像这样的东西:
在我的组件里面 private startMouseMove(start: boolean){
if(start){
@HostListener('mousemove',['$event'])
onMouseMove(event: MouseEvent){
console.log("start mousemove");
this.mousemove.emit(event);
}
}
}
@HostListener('mouseup',['$event'])
onMouseup(event: MouseEvent){
console.log(event.type);
this.startMouseMove(false);
}
@HostListener('mousedown',['$event'])
onMousedown(event: MouseEvent) {
console.log(event.type);
this.startMouseMove(true);
return false; // Call preventDefault() on the event
}
那当然不行.我想知道Angular中是否可能,如果可能,该怎么做? 解决方法
一种可能的解决方案是使用被动方法:
import { Observable } from 'rxjs/Observable';
import { Subscription } from 'rxjs/Subscription';
import 'rxjs/add/observable/fromEvent';
import 'rxjs/add/operator/mergeMap';
import 'rxjs/add/operator/map';
import 'rxjs/add/operator/takeUntil';
@Directive({
selector: '[my-drag]'
})
export class DragDirective {
subscription: Subscription;
constructor(private elRef: ElementRef,private zone: NgZone) {}
ngOnInit() {
this.zone.runOutsideAngular(() => this.initDragEvent());
}
initDragEvent() {
const el = this.elRef.nativeElement;
const mousedown = Observable.fromEvent(el,'mousedown');
const mouseup = Observable.fromEvent(el,'mouseup');
const mousemove = Observable.fromEvent(document,'mousemove');
const mousedrag = mousedown.flatMap((md: any) => {
const startX = md.offsetX;
const startY = md.offsetY;
return mousemove.map((e: any) => {
e.preventDefault();
return {
left: e.clientX - startX,top: e.clientY - startY
};
}).takeUntil(mouseup);
});
this.subscription = mousedrag.subscribe((pos) => {
console.log('mousemove is fired');
el.style.top = pos.top + 'px';
el.style.left = pos.left + 'px';
});
}
ngOnDestroy() {
if(this.subscription) {
this.subscription.unsubscribe();
}
}
}
我正在从角度区域运行initDragEvent,因为我不希望发生冗余更改检测. 另一种解决方案是使用Renderer export class DragDirective {
listener: Function;
@HostListener('mouseup',['$event'])
onMouseup(event: MouseEvent) {
console.log(event.type);
this.startMouseMove(false);
}
@HostListener('mousedown',['$event'])
onMousedown(event: MouseEvent) {
console.log(event.type);
this.startMouseMove(true);
return false;
}
constructor(private renderer: Renderer2) {}
private startMouseMove(start: boolean) {
this.ngOnDestroy();
if (start) {
this.listener = this.renderer.listen(document,'mousemove',() => {
console.log("start mousemove",this.listener);
})
}
}
ngOnDestroy() {
if(this.listener) {
this.listener();
}
}
}
Plunker Example (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- scalamock:子类型上的通配符参数匹配
- Ionic2 / Angular2 / TypeScript:如何访问函数2016中的DOM
- 【angular】——上传图片之删除
- 如何在scala中使用滑动Stream获取斐波那契数字?
- bash – 如何在shell脚本中以格式%Y%m%d打印两个日期之间
- 如何使用最后一个字段作为变量从bash调用awk
- Angular(Jasmine / Karma) – 错误:非法状态:无法加载指令
- angular – 如何创建配置文件(tsconfig.json,typings.json,
- WebService之Http协议和SOAP协议的不同
- Angular 2动画不起作用
