nid*_*eba 2 javascript typescript angular
我在 Angular 对话框中传递数据,但与此同时,当我在对话框中编辑某些内容时,即使我没有保存数据,它也会覆盖数据。例如,我有一个对象,然后单击“编辑”它。它打开一个 Angular 对话框,其中包含该对象的所有数据。
是否只能在单击“保存”按钮时更改数据?我听说 Object.assign 它很有用,但不知道如何使用它。我尝试过,Object.assign
但没有成功。为什么不起作用我认为 this.data 包含另一个数据作为 this.data.education。请参阅下面的代码这是我的对话框代码。
constructor(@Inject(MAT_DIALOG_DATA) public data: EditEducation,
private dialogRef: MatDialogRef<EducationDialogComponent>,
public dataService: ModelDataService) { }
ngOnInit(): void {
if (!this.data.edit) {
this.data.education = {} as SubCategory;
} else {
({education: this.data.education} = Object.assign({}, this.data));
}
}
Run Code Online (Sandbox Code Playgroud)
这就是我打开对话框的方式。
<ul>
<li class="fa fa-pencil addIconTop" (click)="editEducation({edit: true, education: subCategory, model: model})"></li>
<button (click)="addEducation({edit: false, model: model})" class="btn"><i class="fa fa-plus addIconBottom"></i></button>
<button [disabled]="education.subCategories.length === 1" (click)="deleteSubCategory(i)" class="btn"><i class="fa fa-trash deleteIconRight"></i></button>
<li class="fa fa-arrow-down moveIconDown"></li>
<li class="fa fa-arrow-up moveIconTop"></li>
</ul>
public editData(data: EditEducation) {
this.dialog.open(DataDialogComponent, {
data,
});
}
public addData(data: EditEducation) {
this.dialog.open(DataDialogComponent, {
data,
});
}
Run Code Online (Sandbox Code Playgroud)
这是一个用于查看是否是一个新对象或是否需要编辑的界面。
export interface EditEducation {
education?: SubCategory;
edit?: boolean;
model?: Model;
}
Run Code Online (Sandbox Code Playgroud)
这是界面Education
export interface Education {
subCategories: EducationSubCategory[];
}
export interface EducationSubCategory {
name: string;
startDate: number;
endDate: number;
graduation: string;
title?: string;
description: string;
}
Run Code Online (Sandbox Code Playgroud)
您正在经历通过引用传递变量的情况
\n\n\nJavascript 有 5 种按值传递的基本数据类型:
\nBoolean
、null
、undefined
、String
和Number
\n分配有非基本值的变量将获得对该值的引用。该引用指向内存中的 object\xe2\x80\x99s 位置。变量 don\xe2\x80\x99t 实际上包含值
\n当使用 = 将引用类型值(对象)复制到另一个变量时,该值的地址就是实际复制的内容,就好像它一样是一个原始人。对象是通过引用复制的,而不是通过值复制的。
解决该问题的最简单方法是(...)
在分配变量时使用扩展运算符。下面是应该解决问题的代码重构
constructor(@Inject(MAT_DIALOG_DATA) public data: EditEducation,\n private dialogRef: MatDialogRef<EducationDialogComponent>,\n public dataService: ModelDataService) { }\n\n ngOnInit(): void {\n if (!this.data.edit) {\n this.data.education = {} as SubCategory;\n } else {\n ({education: this.data.education} = {...this.data };\n }\n }\n
Run Code Online (Sandbox Code Playgroud)\npublic editData(data: EditEducation) {\n this.dialog.open(DataDialogComponent, { ...data});\n }\npublic addData(data: EditEducation) {\n this.dialog.open(DataDialogComponent, {...data});\n }\n
Run Code Online (Sandbox Code Playgroud)\n
归档时间: |
|
查看次数: |
835 次 |
最近记录: |