我正在尝试通过拖放正确实施NgZone
runOutsideAngular
。在我的架构中,用户可以拖动列表中的元素并将其放在其他位置。在拖动时,我正在显示一个标记,其中元素将被删除。
我实现这个的方式(出于其他一些原因)是当用户拖动一个元素时,我在服务中写了一个对它的引用(没有解释所有不必要的细节,我存储代表该元素的模型)拖动的列表(不是dom元素)),呈现列表的组件将在拖动的元素上显示标记,从服务中读取引用。
现在我遇到了性能问题,我被告知要使用runOutsideAngular
。我就是这样做的
这是我的拖放课程
class MyDragAndDropDirective {
enableDrag() {
this.zone.runOutsideAngular(() => {
Observable.fromEvent(this.el, 'dragover').throttleTime(40).subscribe(e => this.onDragOver(<DragEvent> e));
});
});
onDragOver(event: DragEvent) {
event.preventDefault(); // [1]
const pos = this.getDragPosition(event);
this.dndService.setDraggedOverArticle(this.article, pos); // this is where is set the model to the service
}
}
所以我所做的是将处理程序设置在Angular之外。在我看来,我应该在角度以外运行处理程序,但是,我仍然看到我的UI通过角度神奇地更新,我的表现并没有真正变得更好。似乎它并没有真正在Angular的消化周期之外运行。我也尝试将代码包装在onDragOver
的{{1}}内,但没有区别。