【问题标题】:angular drag and drop cdk doesn't work in angular material dialog角度拖放 cdk 在角度材质对话框中不起作用
【发布时间】:2019-04-14 10:34:20
【问题描述】:

我想通过拖放角度的 CDK 来更改列表顺序。 它适用于我网站中的任何页面,但是当我在材质对话框中使用它时,它不起作用。 当我将一个列表项拖到另一个项目上时,它不会在拖动时改变位置,也不会在放置时改变。 有什么特别的事情可以让它在对话框中工作吗?

我正在尝试的最简单的代码:

HTML

<div cdkDropList (cdkDropListDropped)="drop($event)">
  <div cdkDrag *ngFor="let n of numbers">
    {{n}}
  </div>
</div>

ts 文件

import { CdkDragDrop, moveItemInArray } from '@angular/cdk/drag-drop';

numbers: number[]= [];

constructor() {
  this.n.push(2,3,4,5);
}

drop(event: CdkDragDrop<number[]>) {
  moveItemInArray(this.numbers, event.previousIndex, event.currentIndex);
}

app.module.ts

import { DragDropModule } from '@angular/cdk/drag-drop';

@NgModule({ imports: [..., DragDropModule]})

正如我所说,这段代码可以在任何页面的任何地方工作,但是当我将它复制到对话框组件时它不起作用

【问题讨论】:

  • 你找到解决办法了吗?我遇到了同样的问题。

标签: javascript angular angulardraganddroplists


【解决方案1】:

在这里找到了一个临时解决方案(@DeonduPreez):

https://github.com/angular/components/issues/15880#issuecomment-523476619

这个想法是在对话框打开之前保持当前滚动位置, 然后滚动到顶部, 然后打开对话框, 最后,在对话框关闭后,滚动回保存的位置。

const doc = document.documentElement;
const left = (window.pageXOffset || doc.scrollLeft) - (doc.clientLeft || 0);
const top = (window.pageYOffset || doc.scrollTop) - (doc.clientTop || 0);

if (top != 0 || left != 0) {
  window.scrollTo({ top : 0, left: 0 });
}
const modal: MatDialogRef = this.dialog.open(ModalComponent);
modal.afterClosed().subscribe(() => {
if (top != 0 || left != 0) {
    window.scroll({ top : top, left : left, behavior: "smooth" });
}
});

【讨论】:

  • 谢谢 RoiTr!这对我有用。材料团队有解决方案吗?因为最终用户注意到页面在后台上下移动。
  • @SushrutParanjape 不幸的是,它似乎仍然是一个错误。看看这里的讨论:github.com/angular/components/issues/14280 - 人们说他们使用 .cdk-global-scrollblock { top: 0 !important; } 在他们的全局样式中并修复它。
猜你喜欢
  • 2019-06-02
  • 1970-01-01
  • 2018-11-14
  • 2017-11-02
  • 2020-02-23
  • 1970-01-01
  • 2018-04-01
  • 1970-01-01
  • 2018-07-20
相关资源
最近更新 更多