ExtJS 6.6.0:如何在Ext.data.Batch启动前访问/修改数据(网格单元格编辑场景下的服务器保存问题)
嘿,针对你遇到的这个ExtJS Batch提交日期格式的问题,我有几个靠谱的解决方案,完全适配你的限制条件:
方案1:重写Store的
batch方法 既然Batch是由Store启动的,我们可以直接在Store里重写batch方法,在执行原生的Batch逻辑前,手动遍历所有待提交的记录,把日期字段转换成服务器需要的Y-m-d格式:
Ext.define('MyApp.store.YourStore', { extend: 'Ext.data.Store', model: 'MyApp.model.YourModel', batch: function(options) { // 只处理有修改的脏记录,避免无意义的遍历 this.each(function(record) { if (record.dirty) { var dateFieldValue = record.get('yourDateColumn'); // 替换成你的日期字段名 if (dateFieldValue instanceof Date) { // 把Date对象转成Y-m-d格式的字符串 var formattedDate = Ext.Date.format(dateFieldValue, 'Y-m-d'); // 用setRawValue修改,不会触发额外的脏标记或验证逻辑 record.setRawValue('yourDateColumn', formattedDate); } } }); // 调用父类的原生batch方法,继续执行保存流程 return this.callParent([options]); } });
方案2:监听Proxy的
beforewrite事件 每个Model的Proxy都会在数据提交前触发beforewrite事件,我们可以在这里拦截待提交的数据,修改日期格式:
Ext.define('MyApp.model.YourModel', { extend: 'Ext.data.Model', fields: [ {name: 'id', type: 'int'}, {name: 'yourDateColumn', type: 'date', dateFormat: 'd-M-Y'} // 保持显示格式 ], proxy: { type: 'ajax', // 替换成你实际使用的Proxy类型 url: '/your/server/api', listeners: { beforewrite: function(proxy, operation) { // 获取当前Batch操作里的所有记录 var records = operation.getRecords(); Ext.each(records, function(record) { var dateVal = record.get('yourDateColumn'); if (dateVal instanceof Date) { var formattedDate = Ext.Date.format(dateVal, 'Y-m-d'); // 直接修改记录的data属性,确保提交时用这个格式 record.data.yourDateColumn = formattedDate; } }); } } } });
方案3:优化Model字段的
convert函数 虽然你提到试过dateWriteFormat但没生效,可能是Proxy类型或ExtJS版本的兼容问题,这时候可以用字段的convert函数同时处理读取和写入的格式转换:
Ext.define('MyApp.model.YourModel', { extend: 'Ext.data.Model', fields: [ {name: 'id', type: 'int'}, { name: 'yourDateColumn', type: 'date', dateFormat: 'd-M-Y', // 读取和显示用这个格式 convert: function(value, record) { // 读取服务器数据时:把Y-m-d转成Date对象 if (typeof value === 'string' && !record.isModel) { return Ext.Date.parse(value, 'Y-m-d'); } // 写入服务器时:把Date对象转成Y-m-d字符串 if (record && record.isModel && value instanceof Date && record.dirty) { return Ext.Date.format(value, 'Y-m-d'); } return value; } } ] });
额外说明
如果dateWriteFormat没生效,大概率是因为你的Proxy类型(比如某些自定义Proxy)不支持这个配置,上面的三个方案都是直接操作数据,兼容性更好。记得把代码里的yourDateColumn、YourStore、YourModel替换成你项目里的实际名称哦。
内容的提问来源于stack exchange,提问作者Anand Singh
相关产品推荐
相关产品推荐

