Angular Material: 弹出窗口 Windows : 允许 Windows 在前后移动
Angular Material: Popup Windows : Allow Windows to Go Between Front and Back
我们有 1) Material 对话框组件打开 2) 另一个 Material 对话框组件,当用户按下“打开高级搜索”按钮时。
第一个对话框组件处于固定位置。
第二个对话框组件是可移动的,但是还不能落后于第一个原始组件。
如何做到这一点,用户可以像典型的 Windows 10 桌面应用程序一样,根据 clicked/drag/drop 最后一个是什么,用户可以互换 windows 的前后位置?
第二部分:
public openAdvancedPropertySearchDialog(): void {
const advancedApnSearchDialogRef = this.advancedApnSearchDialog.open(DocumentPropertyGridComponent, {
width: '800px',
height: '450px',
disableClose: true,
autoFocus: false,
data: "test"
hasBackdrop: false
});
advancedApnSearchDialogRef.afterClosed().subscribe(result => {});
}
HTML 第二个组件的代码: 是可移动的:
理想情况下,第一个组件对话框应处于固定位置
<div mat-dialog-title cdkDrag cdkDragRootElement=".cdk-overlay-pane" cdkDragHandle>
<div class="row">
<button class="dialog-button close-button" mat-button (click)="onCancel()">X</button>
</div>
<app-document-property-grid></app-document-property-grid>
</div>
*如果它唯一可能的两个组件都可以用 cdkDrag 移动,而不是第一个 Modal window 被固定,那可以被接受为答案。
资源:
How can i make a MatDialog draggable / Angular Material
这是一个近似的回答,但可能会启发您
您可以为每个 MatDialog 分配一个不同的“id”(并作为数据元素传递)
const dialogRef = this.dialog.open(YourComponentDialog, {
width: '250px',
data: {data: test, id:'child'}, //<--this
disableClose:true,
hasBackdrop:false,
id:'child' //<--this
});
如果在组件的构造函数中注入 OverlayContainer
constructor(public cdk:OverlayContainer,...){}
您可以创建一个接收“id”的函数 toTop
toTop(id)
{
this.cdk.getContainerElement().childNodes.forEach((x:any)=>{
if (x.innerHTML.indexOf('id="'+id+'"')<=0)
x.style["z-index"]=1000;
else
x.style["z-index"]=1001;
})
}
只需调用(点击)中的函数-点击标题或多处即可调用该函数
注意:如果 parent 打开 child,则存储在变量中。所以在打开 child 之前,检查变量,如果打开,只需将它发送到 top
我们有 1) Material 对话框组件打开 2) 另一个 Material 对话框组件,当用户按下“打开高级搜索”按钮时。
第一个对话框组件处于固定位置。 第二个对话框组件是可移动的,但是还不能落后于第一个原始组件。
如何做到这一点,用户可以像典型的 Windows 10 桌面应用程序一样,根据 clicked/drag/drop 最后一个是什么,用户可以互换 windows 的前后位置?
第二部分:
public openAdvancedPropertySearchDialog(): void {
const advancedApnSearchDialogRef = this.advancedApnSearchDialog.open(DocumentPropertyGridComponent, {
width: '800px',
height: '450px',
disableClose: true,
autoFocus: false,
data: "test"
hasBackdrop: false
});
advancedApnSearchDialogRef.afterClosed().subscribe(result => {});
}
HTML 第二个组件的代码: 是可移动的: 理想情况下,第一个组件对话框应处于固定位置
<div mat-dialog-title cdkDrag cdkDragRootElement=".cdk-overlay-pane" cdkDragHandle>
<div class="row">
<button class="dialog-button close-button" mat-button (click)="onCancel()">X</button>
</div>
<app-document-property-grid></app-document-property-grid>
</div>
*如果它唯一可能的两个组件都可以用 cdkDrag 移动,而不是第一个 Modal window 被固定,那可以被接受为答案。
资源:
How can i make a MatDialog draggable / Angular Material
这是一个近似的回答,但可能会启发您
您可以为每个 MatDialog 分配一个不同的“id”(并作为数据元素传递)
const dialogRef = this.dialog.open(YourComponentDialog, {
width: '250px',
data: {data: test, id:'child'}, //<--this
disableClose:true,
hasBackdrop:false,
id:'child' //<--this
});
如果在组件的构造函数中注入 OverlayContainer
constructor(public cdk:OverlayContainer,...){}
您可以创建一个接收“id”的函数 toTop
toTop(id)
{
this.cdk.getContainerElement().childNodes.forEach((x:any)=>{
if (x.innerHTML.indexOf('id="'+id+'"')<=0)
x.style["z-index"]=1000;
else
x.style["z-index"]=1001;
})
}
只需调用(点击)中的函数-点击标题或多处即可调用该函数
注意:如果 parent 打开 child,则存储在变量中。所以在打开 child 之前,检查变量,如果打开,只需将它发送到 top