AG-Grid:无法更新网格中的字段,因为它是只读的

cco*_*ker 1 ag-grid angular

我正在尝试更新 ag-grid 中的一个字段,它不断返回错误类型错误:无法分配给对象“[对象对象]”的只读属性“数量”。

它允许我编辑单元格,但是当我尝试更新它时会出现此错误。

我正在使用来自 ngrx 存储的 observable 来填充 rowData,如下所示:

this.order$.subscribe(order => {
            this.order = { ...order, products: [...order.products] };
        });
Run Code Online (Sandbox Code Playgroud)

我已经检查了上面的内容,我可以通过说 this.orders.products = [] 来更新这个对象,它告诉我它不再是不可变的。

 <mi-ag-grid [data]="order.products" [columnDefs]="columnDefs" [suppressClickEdit]="false"></mi-ag-grid>

columnDefs = [
        {
            headerName: 'Code',
            field: 'code',
            width: 150
        },
        {
            headerName: 'Name',
            field: 'name',
            width: 200,
            editable: true
        },
        {
            headerName: 'Quantity',
            field: 'quantity',
            width: 150,
            editable: true
        }
    ];
Run Code Online (Sandbox Code Playgroud)

我接下来尝试了@GreyBeardedGeek 的建议,并尝试按照下面的方法使用 valueSetter 设置值,但仍然遇到相同的错误。

,
    {
        headerName: 'Quantity',
        width: 150,
        editable: true,
        field: 'quantity',
        valueSetter: quantityValueSetter
    },


function quantityValueSetter(params): any {
console.log(params);
params.data.quantity = params.newValue;
Run Code Online (Sandbox Code Playgroud)

}

Gre*_*eek 5

您从商店获取并在网格中使用的对象是不可变的。

默认情况下,当您使网格中的一列可编辑时,它会尝试直接更新支持对象,这就是您所看到的问题 - 网格试图改变不可变对象。

解决方案是将“valueSetter”属性添加到网格列的定义中。此属性的值应该是一个函数,它将接收新值,然后使用该新值来更新存储。

设置此属性后,ag-grid 不会尝试直接更新对象。