Angular 4:复制一个数组以保存初始值,但两个数组都由表单更新

Posted

技术标签:

【中文标题】Angular 4:复制一个数组以保存初始值,但两个数组都由表单更新【英文标题】:Angular 4 : copy an array to save initial values but both arrays are updated by the form 【发布时间】:2018-09-02 10:15:37 【问题描述】:

我是一名初学者,正在开发一个使用 JHipster 构建并使用 Angular 4.3 的应用程序。

我正在开发一种用户可以在其中编辑颜色的表单。我必须保存初始值以防用户编辑颜色,但最终没有验证保存(确认模式)。所以我必须回到初始值。但实际上,当我复制初始值时,两个数组都由表单值更新。

我的代码如下所示:

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;
    

但问题是 initialColors 采用与颜色相同的值...(当我执行 console.log 时,两个数组都具有由表单更新的相同 rgb)

我的表单如下所示:

<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】:

不要使用Object.assign([], anotherArr) 并且不要将颜色分配给initialColors。克隆它。您可以使用 lodash 库像这样克隆数组:

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);
    

Code example

在您的情况下,两个数组对象引用是相同的:

this.colors[0] == this.initialColors[0] // true

因此,您在表单中编辑相同的对象数组

如果你因为某种原因不能lodash。 Deep copying array of nested objects in javascript

【讨论】:

以上是关于Angular 4:复制一个数组以保存初始值,但两个数组都由表单更新的主要内容,如果未能解决你的问题,请参考以下文章

设置初始值Angular 2反应formarray

无法转换类型错误,但两种类型都相同? [复制]

c++如何定义布尔型数组使其初始值为true?

将字节数组初始化为某个值,而不是默认的null? [复制]

如何在可配置计数的静态结构数组中初始化具有特定值的成员? [复制]

JS 使用reduce进行数组去重