Angular 4 : copy an array to save initial values but both arrays are updated by the form
我是一个初学者,正在开发一个用Jhipster构建并使用Angular4.3的应用程序。
我正在处理一个用户可以编辑颜色的表单。我必须保存初始值,以防用户编辑颜色,但最终无法验证保存(确认模式)。所以我必须回到初始值。但实际上,当我复制初始值时,两个数组都会被表单值更新。
我的代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | export class MyComp implements OnInit { initialColors: Color[]; // the object Color has an id, a name and a rgb as attributes colors: []; constructor(private service: ColorService, private confirmationDialogService: ConfirmationDialogService) {} ngOnInit() { this.getColors(); } getColors() { this.service.query.subscribe( this.colors= res.json; this.initialColors= Object.assign([], this.colors); // I've tried with res.json too }, (res: ResponseWrapper) => this.onError(res.json) ); } submitColors(form) { this.confirmationDialogService.confirm('Validation','Do you want to save changes ?') .then((confirmed) => { if (confirmed === true) { // stuff to save is OK } else { // want to return to initial state this.colors= this.initialColors; } } |
但问题是,初始颜色的值与颜色的值相同…(当我执行console.log时,两个数组都具有由表单更新的相同RGB)
我的表单如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | <form #colorForm="ngForm" (ngSubmit)="submitColors(colorForm.form.value);"> <table> <tr *ngFor="let c of colors| orderBy: 'id';"> <td>{{c.label| translate}} :</td> <td> <input type="color" [(ngModel)]="c.color" #nameField="ngModel" name="{{c.label}}" (ngValue)="c.color" [ngStyle]="{'color-rendering': c.color}"/> </td> </tr> </table> <button type="submit" class="btn btn-sm"> <span class="fa fa-save"></span> <span class="d-none d-md-inline" jhiTranslate="entity.action.save">Save</span> </button> </form> |
有人有主意吗?
不要使用
1 2 3 4 5 6 7 8 9 10 | submitColors(form) { this.confirmationDialogService.confirm('Validation','Do you want to save changes ?') .then((confirmed) => { if (confirmed === true) { // stuff to save is OK } else { // want to return to initial state // this.colors= _.cloneDeep(this.initialColors); } |
代码示例
在您的例子中,两个数组对象引用是相同的:
1 | this.colors[0] == this.initialColors[0] // true |
因此,在窗体中编辑相同的对象数组
如果你因为某种原因不能做到的话。在javascript中深度复制嵌套对象数组