javascript - Angular 2 不检测@HostBinding 的变化

标签 javascript angularjs events drag-and-drop

我使用 @HostBinding 与 Chrome 的拖放 API 一起设置一个类,如下所示:

@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 方法(其中 ref 是一个 ChangeDetectorRefappRef 是一个 ApplicationRef),但是它没有帮助。

最佳答案

我想我找到了问题的解决方案: drop 事件不会在已拖动的项目上触发,但会在拖放到其上的项目上触发。这意味着我需要在 dragend 回调中设置 this.isDraggedArticle = false 而不是设置:

@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;
    }
}

关于javascript - Angular 2 不检测@HostBinding 的变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43546938/

相关文章:

javascript - JavaScript 中的鼠标滚轮、滚轮和 DOMMouseScroll

javascript - 一次单击即可实现两个功能 - Javascript

javascript - 嵌套 ng-Repeat 不起作用

javascript - Angular Js 中一个或多个实体的验证失败

javascript - 我需要从 $scope 到其他数据库的不同 id 中获取最大值

c# - C#防止创建附加表单

wpf - 什么是 WPF 预览事件?

javascript - 执行 JavaScript 时,CSS 规则不会产生任何影响

javascript - 如何使用数组方法 foreach() 或 map() 将数独板打印到控制台上?

javascript - Vue.js:如何在已打开的选项卡中打开外部链接?