Angular2,拖动事件。关闭问题
Angular2, Drag events. Closure issue
我正在为 Angular2 中的可拖动组件构建一个指令。它必须跨浏览器工作,这是我遇到问题的地方。我了解到在 FireFox 上,您无法查看 'onDrag' 鼠标事件的 x、y 坐标。所以我将一个事件处理程序附加到文档,以便我可以使用 'dragover' 函数检索坐标。但是我认为我对事件处理程序的关闭有一些问题。
在初始化时,我为整个文档附加了 dragover 处理程序并将它们存储在全局临时变量中。但是,当我尝试访问它们时 'onDrag' 它们仍处于原始值。
你能帮我解决这个问题吗?或者至少明白我做错了什么?
谢谢
import {Directive, ElementRef, Renderer, OnInit, HostListener, Input} from '@angular/core';
@Directive({
selector: '[appDraggable]'
})
export class DraggableDirective implements OnInit {
@Input('appDraggable') data: any;
private deltaX: number = 0;
private deltaY: number = 0;
private tempX: number = 0;
private tempY: number = 0;
constructor(private _elementRef: ElementRef, private renderer: Renderer) {}
ngOnInit() {
//get the current element
this.renderer.setElementAttribute(this._elementRef.nativeElement, 'draggable', 'true');
//event listener to retrieve dragover coordinates.
document.addEventListener("dragover", function (ev: DragEvent) {
this.tempX = ev.x;
this.tempY = ev.y;
});
}
@HostListener('dragstart', ['$event'])
onDragStart(e) {
if (e.dataTransfer != null) {
e.dataTransfer.setData('text/plain', null);
}
console.log("started dragging");
this.deltaX = e.x - this._elementRef.nativeElement.offsetLeft;
this.deltaY = e.y - this._elementRef.nativeElement.offsetTop;
}
@HostListener('drag', ['$event'])
onDrag(e) {
console.log(this.tempX);
this.setChanges(this._elementRef.nativeElement, this.renderer, this.tempX, this.tempY, this.deltaX, this.deltaY);
}
@HostListener('dragend', ['$event'])
onDragEnd(e) {
this.deltaX = 0;
this.deltaY = 0;
console.log('stopped dragging!');
document.removeEventListener('dragover');
}
private setChanges(el: any, rend: Renderer, tempX: number, tempY: number, delX: number, delY: number) {
if (!tempX || !tempY) return;
rend.setElementStyle(el, 'top', (tempY - delY) + 'px');
rend.setElementStyle(el, 'left', (tempX - delX) + 'px');
}
}
使用箭头函数 () => {
而不是 function () {
以保留 this
的范围
ngOnInit() {
//get the current element
this.renderer.setElementAttribute(this._elementRef.nativeElement, 'draggable', 'true');
//event listener to retrieve dragover coordinates.
document.addEventListener("dragover", (ev: DragEvent) =>{
this.tempX = ev.x;
this.tempY = ev.y;
});
}
我正在为 Angular2 中的可拖动组件构建一个指令。它必须跨浏览器工作,这是我遇到问题的地方。我了解到在 FireFox 上,您无法查看 'onDrag' 鼠标事件的 x、y 坐标。所以我将一个事件处理程序附加到文档,以便我可以使用 'dragover' 函数检索坐标。但是我认为我对事件处理程序的关闭有一些问题。
在初始化时,我为整个文档附加了 dragover 处理程序并将它们存储在全局临时变量中。但是,当我尝试访问它们时 'onDrag' 它们仍处于原始值。
你能帮我解决这个问题吗?或者至少明白我做错了什么? 谢谢
import {Directive, ElementRef, Renderer, OnInit, HostListener, Input} from '@angular/core';
@Directive({
selector: '[appDraggable]'
})
export class DraggableDirective implements OnInit {
@Input('appDraggable') data: any;
private deltaX: number = 0;
private deltaY: number = 0;
private tempX: number = 0;
private tempY: number = 0;
constructor(private _elementRef: ElementRef, private renderer: Renderer) {}
ngOnInit() {
//get the current element
this.renderer.setElementAttribute(this._elementRef.nativeElement, 'draggable', 'true');
//event listener to retrieve dragover coordinates.
document.addEventListener("dragover", function (ev: DragEvent) {
this.tempX = ev.x;
this.tempY = ev.y;
});
}
@HostListener('dragstart', ['$event'])
onDragStart(e) {
if (e.dataTransfer != null) {
e.dataTransfer.setData('text/plain', null);
}
console.log("started dragging");
this.deltaX = e.x - this._elementRef.nativeElement.offsetLeft;
this.deltaY = e.y - this._elementRef.nativeElement.offsetTop;
}
@HostListener('drag', ['$event'])
onDrag(e) {
console.log(this.tempX);
this.setChanges(this._elementRef.nativeElement, this.renderer, this.tempX, this.tempY, this.deltaX, this.deltaY);
}
@HostListener('dragend', ['$event'])
onDragEnd(e) {
this.deltaX = 0;
this.deltaY = 0;
console.log('stopped dragging!');
document.removeEventListener('dragover');
}
private setChanges(el: any, rend: Renderer, tempX: number, tempY: number, delX: number, delY: number) {
if (!tempX || !tempY) return;
rend.setElementStyle(el, 'top', (tempY - delY) + 'px');
rend.setElementStyle(el, 'left', (tempX - delX) + 'px');
}
}
使用箭头函数 () => {
而不是 function () {
以保留 this
ngOnInit() {
//get the current element
this.renderer.setElementAttribute(this._elementRef.nativeElement, 'draggable', 'true');
//event listener to retrieve dragover coordinates.
document.addEventListener("dragover", (ev: DragEvent) =>{
this.tempX = ev.x;
this.tempY = ev.y;
});
}