ExtJS 7中JsonStore.sync()未调用对应PHP脚本问题排查
针对你碰到的问题,结合你提供的代码示例,下面是需要检查和调整的store/proxy参数及代码细节:
1. 必须配置模型的idProperty
ExtJS靠模型的idProperty判断是新增(无有效主键)还是更新(有有效主键)操作。如果你的模型没显式配置这个属性,或者配置的字段和数据库主键不匹配,store根本不会触发对应的create/update请求。
给你的模型补充配置示例:
Ext.define('AppName.model.Model_Name', { extend: 'Ext.data.Model', idProperty: '你的主键字段名', // 比如'id'或'user_id' fields: [ // 你的字段列表 ] });
2. 调整Proxy的Writer配置
你的writer设置了encode: true,在ExtJS7中,这个配置会把JSON数据编码成URL参数传递,但如果PHP端是用file_get_contents('php://input')获取数据,就会出现空获取的情况。给你两种调整方案:
方案A:保留encode为true,PHP用$_POST接收
添加allowSingle: true(因为你设置了batchActions: false,确保单条数据能正确编码):
writer: { type: 'json', writeAllFields: true, encode: true, rootProperty: 'data', allowSingle: true // 新增配置,保证单条数据正确编码 }
PHP端接收示例:
$data = $_POST['data']; $record = json_decode($data, true);
方案B:设置encode为false,传递纯JSON数据
这种方式更符合RESTful规范,需要添加请求头告知PHP接收JSON格式:
proxy: { type: 'ajax', batchActions: false, api: { /* 你的API地址保持不变 */ }, // 新增请求方法配置,确保create/update使用POST actionMethods: { create: 'POST', update: 'POST', read: 'GET', destroy: 'POST' }, headers: { 'Content-Type': 'application/json' // 新增,告诉PHP接收JSON数据 }, reader: { /* 你的reader配置保持不变 */ }, writer: { type: 'json', writeAllFields: true, encode: false, // 修改为false rootProperty: 'data', allowSingle: true } }
PHP端接收示例:
$rawData = file_get_contents('php://input'); $data = json_decode($rawData, true); $record = $data['data'];
3. 修正更新代码的错误
你更新模型的代码存在错误!form.set('field_1', value_1)是错误写法,应该给模型调用set方法,而不是表单。错误写法会导致模型未被标记为“脏数据”,store.sync()不会触发更新请求:
错误代码:
form.set('field_1', value_1); form.set('field_2', value_2);
修正为:
model.set('field_1', value_1); model.set('field_2', value_2);
另外,调用form.updateRecord(model)后,可以打印model.dirty查看是否为true,如果是false,说明要么字段没有变化,要么模型配置存在问题。
4. 删除冲突的batchUpdateMode配置
你设置了batchUpdateMode: 'complete',但同时开启了batchActions: false,这两个配置冲突。batchActions: false表示每条数据单独发送请求,batchUpdateMode完全无效,直接删除该行即可:
// 删除这行配置 batchUpdateMode: 'complete',
5. 用浏览器调试确认请求状态
按F12打开开发者工具,查看Network标签:
- 如果没有发送请求:说明模型未被标记为脏数据,或者store未识别到新增/修改的记录
- 如果发送了请求但PHP无输出:检查请求参数、Content-Type是否正确,同时开启PHP错误日志排查后端问题
内容的提问来源于stack exchange,提问作者Razgriz

