【发布时间】:2018-10-26 12:16:11
【问题描述】:
我创建了一个 Directive 来使用一个元素作为带有原生 HTML 拖放的“dropzone”
指令来源
import { Directive, ElementRef, OnInit, Output, EventEmitter, ViewChild }
from '@angular/core';
import { environment } from 'src/environments/environment';
@Directive({
selector: '[app-drop-zone]'
})
export class DropzoneDirective implements OnInit {
@Output('outbound-listener') outBoundListener = new EventEmitter();
constructor(private e: ElementRef) {
e.nativeElement.ondrop = this.drop;
e.nativeElement.ondragover = this.dragOver;
e.nativeElement.ondragenter = this.dragEnter;
e.nativeElement.ondragleave = this.dragLeave;
}
ngOnInit(): void { }
private drop(event: any){
let files: File[] = []; // temprary cache for dropped files
if (event.stopPropagation) {
event.stopPropagation(); // Stops some browsers from redirecting.
}
event.currentTarget.classList.remove('over'); // remove the
dotted background, once user release the content (drop-end)
// process dropped items
if(event.dataTransfer.items){
for(let i = 0; i< event.dataTransfer.items.length; i++){
if(event.dataTransfer.items[i].kind == "file"){
files.push(event.dataTransfer.items[i].getAsFile());
}
}
if(files.length > 0){
this.outBoundListener.emit({ type:
environment.component_events.INIT_FILE_UPLOAD, data: files});
}
}
return false;
}
private dragOver(e){
if(e.preventDefault)
e.preventDefault();
e.dataTransfer.dropEffect = 'move';
return false;
}
private dragEnter(event: any) {
event.currentTarget.classList.add('over');
}
private dragLeave(event: any) {
event.currentTarget.classList.remove('over');
}
}
** 请忽略代码格式问题 :-(
问题这里是,在方法 'drop' 中,我想访问 Directive Class prop outBoundListener 这是一个 EventEmitter 但我无法通过 this 调用它
对此的任何帮助将不胜感激..
【问题讨论】:
-
应该可以使用
this.outBoundListener访问。 -
^ 这实际上是我的问题。无法访问,
this这里指的是所有者(被调用者) -
奇怪的是,“JS 闭包标准”在这里没有发挥作用。如果您使用
function drop语法,就会出现这种情况,但是您声明它的方式,this应该绝对指向您的对象,而不是函数。你得到的具体错误是什么? -
只是“无法读取属性
outboundListenerofundefined”。 -
^ 更新了我的提交。这种情况的解决办法是什么?