首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当对话框被取消时,数据会被更新-角材料

当对话框被取消时,数据会被更新-角材料
EN

Stack Overflow用户
提问于 2022-04-04 15:10:01
回答 1查看 578关注 0票数 1

我正面临以下问题,不幸的是,我看不出这里有什么问题。

我有一个材料对话框,其中给定的列表可以被编辑,项目可以添加,删除或修改)。在我的对话框中有两个按钮:CancelSubmit

我希望在单击时删除中的所有更改,并且不希望修改列表。

我有以下代码:

代码语言:javascript
复制
constructor(public dialog: MatDialog) { }

@Input() myData: MyObjectType;

 openDialog() {
    const dialogRef = this.dialog.open(MyDialogComponent, {
        width: 'auto',
        data: { 'dataINeed': this.myData}
    });
    dialogRef.afterClosed().subscribe(rp => {
       console.log(rp);
}

这是我的MyDialogComponent

代码语言:javascript
复制
constructor(
    public dialogRef: MatDialogRef<MyDialogComponent>,
    @Inject(MAT_DIALOG_DATA) public data: { 'dataINeed': MyObjectType},
) { }

deleteItem(item: ItemType) {
    this.data.itemListe.forEach(o => {
        if (o === item) {
            const index = this.data.itemListe.indexOf(o);
            this.data.itemListe.splice(index, 1);
        }
    });
}

valueChange(updatedValue: string, item: ItemType): void {
    this.data.itemListe[this.data.itemListe.indexOf(item)].propertyfield = updatedValue;
}

addItem() {
    const newItem: ItemType= {
        a: '',
        b: '',
        c: '',
        d: false,
        e: ''
    };
    this.data.itemListe.push(newItem);
}

onCancel() {
    this.dialogRef.close();
}

onSubmit() {
    this.dialogRef.close({ data: this.data })
}


<div class="material-dialog">
<h2 class="mat-dialog-title">My item list</h2>
    <p>Items:</p>
    <div id="mat-list-item-container" *ngFor="let item of data.itemListe"
        class="grid-container-two-delete grid-container">
        <mat-form-field appearance="outline" style="padding-right: 1em;">
            <input matInput (change)="valueChange($event.target.value, item)" [value]="item.c">
        </mat-form-field>
        <mat-icon svgIcon="delete_red" (click)="deleteItem(item)">
        </mat-icon>
    </div>
    <button mat-button (click)="addItem()">
        <mat-icon svgIcon="add_circle"></mat-icon>&nbsp;&nbsp;
        Add item
    </button>
</div>
<br>
<mat-dialog-actions>
    <div class="grid-container-two">
        <div class="grid-item-left"><button class="button--secondary" type="button"
                (click)="onCancel()">Cancel</button>
        </div>
        <div class="grid-item-right"><button mat-button (click)="onSubmit()">OK</button></div>
    </div>
</mat-dialog-actions>

当我测试并删除一些项目,重写其他项目的propertyfield时,最后单击Cancel,我的对话框就会关闭。如果我再次通过父组件打开它,则会发生更改。我不明白为什么,因此我没有在我的关闭方法中发送任何数据。

我试着创建我的列表的一个深刻的副本,并对此进行操作,但这是行不通的。

我做错了什么?

非常感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-04-04 21:39:03

在将数据传递给您的模式之前,您可能希望克隆数据:

代码语言:javascript
复制
constructor(public dialog: MatDialog) { }

@Input() myData: MyObjectType;

 openDialog() {
    const dialogRef = this.dialog.open(MyDialogComponent, {
        width: 'auto',
        data: { 'dataINeed': cloneDeep(this.myData)}
    });
    dialogRef.afterClosed().subscribe(rp => {
       console.log(rp);
}

我通常会使用cloneDeep来创建一个深入的克隆。这将将克隆的对象传递给对话框,而不是对数据的引用。这样,一旦它被关闭,将数据返回到父组件/服务的唯一方法就是从对话框中获取结果。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71739604

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档