You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ExtJs 6.0.0中如何通过REST PUT请求向Spring后端提交更新数据?

解决ExtJS手动设置Store数据后发送REST PUT请求的问题

嘿,我来帮你捋清楚这个问题!你的核心困扰在于Store里的数据是通过setValue手动注入的,不是Proxy自动加载的,所以默认的record.save()没法直接满足你带额外数据的更新需求对吧?别慌,这里有几个实用的解决方案:

方案一:手动用Ext.Ajax发送PUT请求(最灵活)

这个方法完全绕开Store的自动机制,直接构建请求,适合你需要额外添加数据的场景。你可以把更新属性和模态框收集的额外数据合并成请求体,直接发给后端:

updateRecord: function(objectId, objectWithUpdateProperties) {
    // 合并更新属性和额外数据(这里替换成你实际的额外字段)
    const requestPayload = {
        ...objectWithUpdateProperties,
        additionalField1: '从模态框获取的值',
        additionalField2: '其他额外数据'
    };

    Ext.Ajax.request({
        url: `/somepath/theclass/${objectId}`, // 后端REST PUT接口地址
        method: 'PUT',
        jsonData: requestPayload, // 自动序列化为JSON
        success: function(response) {
            const responseData = Ext.decode(response.responseText);
            // 请求成功后,同步更新Store里的对应记录
            const targetRecord = this.store.getById(objectId);
            if (targetRecord) {
                targetRecord.set(requestPayload);
            }
            Ext.Msg.alert('成功', '数据更新完成');
        },
        failure: function(response) {
            // 处理失败逻辑,比如提示用户
            Ext.Msg.alert('错误', `更新失败:${response.statusText}`);
        },
        scope: this // 确保success/failure里的this指向当前组件
    });
}

这个方案的好处是完全可控,不管Store数据是怎么来的,都能直接发送请求,而且可以自由组合任意需要的数据,特别适合你的场景。

方案二:标记手动添加的记录为非新增,复用Store Proxy

如果你想复用Store已有的Proxy配置(比如URL、Writer设置),可以在setValue方法里给每条记录标记为非新增(phantom: false),这样ExtJS就会认为这些记录是从服务器来的,调用record.save()时会自动发PUT请求:

首先修改setValue方法:

setValue: function(myObject) {
    // 把原始数据转换成Store的Record实例,并标记为非新增
    const recordList = myObject.data.items.map(item => {
        const record = Ext.create(this.store.model, item);
        record.setId(item.id); // 确保记录ID正确
        record.phantom = false; // 关键:标记为已存在于服务器的记录
        return record;
    });
    this.store.setData(recordList);
}

然后修改updateRecord方法:

updateRecord: function(objectId, objectWithUpdateProperties) {
    const targetRecord = this.store.getById(objectId);
    if (!targetRecord) return;

    // 合并更新属性和额外数据
    const updateData = {
        ...objectWithUpdateProperties,
        additionalField: '额外数据内容'
    };

    // 更新记录属性
    targetRecord.set(updateData);

    // 调用save,此时会触发Proxy的PUT请求
    targetRecord.save({
        success: function(record, operation) {
            Ext.Msg.alert('成功', '数据更新成功');
        },
        failure: function(record, operation) {
            const errorMsg = operation.getError() || '更新失败';
            Ext.Msg.alert('错误', errorMsg);
        }
    });
}

这个方案适合想复用现有Proxy配置的情况,不用重复写URL和序列化逻辑。

方案三:直接调用Proxy的update方法

介于前两者之间,既复用Proxy的配置,又手动控制请求内容:

updateRecord: function(objectId, objectWithUpdateProperties) {
    const requestPayload = {
        ...objectWithUpdateProperties,
        additionalField: '额外数据'
    };

    const proxy = this.store.getProxy();
    proxy.update({
        url: `${proxy.url}/${objectId}`,
        jsonData: requestPayload,
        success: function(response) {
            const targetRecord = this.store.getById(objectId);
            if (targetRecord) {
                targetRecord.set(requestPayload);
            }
            Ext.Msg.alert('成功', '更新完成');
        },
        failure: function(response) {
            Ext.Msg.alert('错误', '更新失败,请重试');
        },
        scope: this
    });
}

总结

如果你的场景需要频繁添加额外数据,方案一是最推荐的,逻辑清晰且灵活;如果想复用Store的Proxy配置,方案二更合适。

内容的提问来源于stack exchange,提问作者Dirk Schumacher

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:43:36