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

ExtJS4升级ExtJS6后Store报No type specified for writer.create错误求助

解决ExtJS4升级到ExtJS6后Store Writer的报错问题

你遇到的这两个错误,核心原因确实是ExtJS6对Writer的定义和数据处理逻辑做了不少调整,和ExtJS4的写法不兼容了。我帮你拆解问题并给出修复方案:

错误根源分析

  1. No type specified for writer.create:ExtJS6要求必须明确指定Writer的type属性,而你之前的写法直接用Ext.data.writer.Json.override()定义Writer,没有声明类型,导致框架无法识别Writer的类型。
  2. 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'}
    ]
});

关键修改点说明

  1. 指定Writer类型:添加type: 'json',让框架正确识别Writer类型,解决No type specified for writer.create错误。
  2. 替换全局override为局部重写:不再直接修改全局的Ext.data.writer.Json,而是在当前Store的Writer配置里直接重写getRecordData方法,避免污染全局组件。
  3. 调整Store数据遍历方式:
    • 用assocStore.each()遍历关联Store的记录,替代原来的Ext.Array.each(assocStore.data.items);
    • 用assocItem.getData()获取模型的原始数据,替代直接访问assocItem.data,这是ExtJS6推荐的写法。
  4. 保留callParent的正确使用:你之前把callOverridden换成callParent是正确的,这部分不需要改动。

额外注意事项

确保你的自定义父类Extends.data.Store在ExtJS6下是兼容的,没有使用废弃的API,否则可能引发其他隐藏问题。

这样修改后,你的Store应该既能正常加载初始数据,也能在按钮点击时正确处理提交逻辑,不会再出现之前的错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:19:43