ExtJS4升级ExtJS6后Store报No type specified for writer.create错误求助
解决ExtJS4升级到ExtJS6后Store Writer的报错问题
你遇到的这两个错误,核心原因确实是ExtJS6对Writer的定义和数据处理逻辑做了不少调整,和ExtJS4的写法不兼容了。我帮你拆解问题并给出修复方案:
错误根源分析
No type specified for writer.create:ExtJS6要求必须明确指定Writer的type属性,而你之前的写法直接用Ext.data.writer.Json.override()定义Writer,没有声明类型,导致框架无法识别Writer的类型。Uncaught TypeError: items.slice is not a function:ExtJS6里Store的data属性不再是包含items数组的对象,而是Ext.util.Collection类型的集合,直接访问assocStore.data.items会拿到undefined,自然调用不了slice方法。
修复后的Store代码
把你原来的proxy.writer部分替换成下面的写法,同时调整关联数据的遍历方式:
Ext.define('Stm.store.stmpdate', { extend: 'Extends.data.Store', requires: [ 'Cstm.Setting', 'Stm.model.stmpdate' ], model: 'Stm.model.stmpdate', pageSize: Stm.Const.controller.dataCountLimit, remoteSort: true, proxy: { type: 'ajax', url: Cstm.Setting.getEntryUrl() + '/stm/stm-update/stm-update', reader: { type: 'json', rootProperty: 'data' }, // 修正后的Writer配置 writer: { type: 'json', // 必须指定Writer类型,解决第一个错误 getRecordData: function(record) { // 用callParent调用父类方法,替代原来的callOverridden var data = this.callParent(arguments); if (record.associations.length > 0) { Ext.Array.each(record.associations.keys, function(key) { data[key] = []; var assocStore = record[key](); // ExtJS6中用each遍历Store记录,或者用getRange()获取数组 assocStore.each(function(assocItem) { // 用getData()获取模型数据,替代直接访问data属性 data[key].push(assocItem.getData()); }); }); } return data; } }, api: { create: Cstm.Setting.getEntryUrl() + '/stm/stm-update/application', update: Cstm.Setting.getEntryUrl() + '/stm/stm-update/approval' }, actionMethods: { create: 'POST', read: 'POST', update: 'POST', destroy: 'POST' } }, sorters: [ {property: 'aplDatetime', direction: 'DESC'}, {property: 'siteDomain', direction: 'ASC'}, {property: 'pageName', direction: 'ASC'} ] });
关键修改点说明
- 指定Writer类型:添加
type: 'json',让框架正确识别Writer类型,解决No type specified for writer.create错误。 - 替换全局override为局部重写:不再直接修改全局的
Ext.data.writer.Json,而是在当前Store的Writer配置里直接重写getRecordData方法,避免污染全局组件。 - 调整Store数据遍历方式:
- 用
assocStore.each()遍历关联Store的记录,替代原来的Ext.Array.each(assocStore.data.items); - 用
assocItem.getData()获取模型的原始数据,替代直接访问assocItem.data,这是ExtJS6推荐的写法。
- 用
- 保留callParent的正确使用:你之前把
callOverridden换成callParent是正确的,这部分不需要改动。
额外注意事项
确保你的自定义父类Extends.data.Store在ExtJS6下是兼容的,没有使用废弃的API,否则可能引发其他隐藏问题。
这样修改后,你的Store应该既能正常加载初始数据,也能在按钮点击时正确处理提交逻辑,不会再出现之前的错误。
内容的提问来源于stack exchange,提问作者maryyyyyyy
相关产品推荐
相关产品推荐

