2017-04-21 42 views
1

我用@HostBinding與Chrome的拖放在一起設置一個類的變化和Drop API這樣的:角2沒有偵測到@HostBinding

@Directive({ selector: '[sortable-article]' }) 
export class SortableArticleComponent { 

    @HostBinding('class.dragged-element') 
    isDraggedArticle: boolean = false; 

    constructor(elRef: ElementRef, private ref: ChangeDetectorRef, private appRef: ApplicationRef, private dndService: ArticleDndService) { 
     this.el = elRef.nativeElement; 
     Observable.fromEvent(this.el, 'dragstart').subscribe(e => this.onDragStart(<DragEvent> e)); 
     Observable.fromEvent(this.el, 'drop').subscribe(e => this.onDrop(<DragEvent> e)); 
    } 

    onDragStart(event: DragEvent) { 
     this.isDraggedArticle = true; 
    } 

    onDrop(event: DragEvent) { 
     event.preventDefault(); 
     this.isDraggedArticle = false; 
    } 
} 

什麼情況是,更多的時間則沒有,isDraggedArticle類不從元素中刪除,我不知道爲什麼。我嘗試添加

this.ref.detectChanges(); 
this.appRef.tick(); 

到onDrop方法(其中refChangeDetectorRefappRefApplicationRef),但它並不能幫助。

+0

所以你onDrop方法被調用,在合適的時間和isDraggedArticle不會改變? – Sam

+0

是的,好點,但我可以證實,因爲實際上更多的東西發生在onDrop上,實際上被執行。 – Lukas

+0

對我來說你的代碼是正確的。如果你在構造函數中初始化isDraggedArticle,沒有改變? @HostBinding('class.dragged-element') isDraggedArticle:boolean; 構造函數(this.isDraggedArticle = false) – Sam

回答

1

Ich認爲我找到了問題的解決方案:drop事件未被拖動的項目觸發,而是在被拖放的項目上被觸發。這意味着,而不是在下降回調設置this.isDraggedArticle = false,我需要做的是在dragend回調:

@Directive({ selector: '[sortable-article]' }) 
export class SortableArticleComponent { 

    @HostBinding('class.dragged-element') 
    isDraggedArticle: boolean = false; 

    constructor(elRef: ElementRef, private ref: ChangeDetectorRef, private appRef: ApplicationRef, private dndService: ArticleDndService) { 
     this.el = elRef.nativeElement; 
     Observable.fromEvent(this.el, 'dragstart').subscribe(e => this.onDragStart(<DragEvent> e)); 
     Observable.fromEvent(this.el, 'dragend').subscribe(e => this.onDragEnd(<DragEvent> e)); 
    } 

    onDragStart(event: DragEvent) { 
     this.isDraggedArticle = true; 
    } 

    onDragEnd(event: DragEvent) { 
     this.isDraggedArticle = false; 
    } 
}