ExtJs-> Ext.Store.proxy.writer错误:没有为writer.create指定类型

时间:2018-05-17 07:00:09

标签: extjs extjs6 extjs6-classic

所以我从extjs4升级到extjs6,这个商店总是有这个错误:

  

没有为writer.create指定类型

此代码有两个用途:

  1. 获取初始页面的数据
  2. 用于在点击按钮时获取数据。
  3. 每当我注释掉proxy.writer代码部分时,它都会生成初始页面的数据。 但每当我不发表评论时,它都不会获得初始页面的数据。 每当我点击一个按钮时,它也会返回此错误:

      

    未捕获的TypeError:items.slice不是函数

    所以我的问题是,作者部分是否有错误的语法或其他东西,因为它被更新为extjs6?

    P.S。我试图改变 this.callOverriddenthis.callParent,因为它声明this.callOverridden已被弃用,但仍有相同的错误。

    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: Ext.data.writer.Json.override({
            getRecordData: function() {
                var data = this.callOverridden(arguments);
    
                var record = arguments[0];
    
                if ( record.associations.length > 0 ) {
                    Ext.Array.each(record.associations.keys, function(key) {
                        data[key] = [];
    
                        var assocStore = record[key]();
    
                        Ext.Array.each(assocStore.data.items, function(assocItem) {
                            data[key].push(assocItem.data);
                        });
                    });
                }
                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'}
    ]
    
    });
    

    型号:

    Ext.define('Stm.model.stmpdate', {
    extend: 'Ext.data.Model',
    fields: [
        {name: 'siteId', type: 'integer'},
        {name: 'siteName', type: 'string'},
        {name: 'siteUrl', type: 'string'},
        {name: 'tmpId', type: 'integer', defaultValue: 1},
        {name: 'updType', type: 'string'}
    ],
    
    hasMany: [{
        model: 'Stm.model.ServerInfo',
        name: 'servers',
        associationKey: 'servers',
        reference: 'tmpId'
    }]
    
    });
    

1 个答案:

答案 0 :(得分:1)

是的,您使用的方式可能在ExtJS 4中有效,但在所有版本的ExtJS中都不支持AFAIK。

您要做的是将自定义编写器定义为新类:

Ext.define('MyApp.app.data.MyCustomJsonWriter', {
    extend: 'Ext.data.writer.Json',
    alias: 'writer.mycustomjson',
    getRecordData: function() {
        var data = this.callParent(arguments);

        var record = arguments[0];

        if ( record.associations.length > 0 ) {
            Ext.Array.each(record.associations.keys, function(key) {
                data[key] = [];

                var assocStore = record[key]();

                Ext.Array.each(assocStore.data.items, function(assocItem) {
                    data[key].push(assocItem.data);
                });
            });
        }
        return data;
    }
});

要求商店中的类:

requires: [
    'MyApp.app.data.MyCustomJsonWriter'
]

然后通过别名实例化它:

writer: {
    type: 'mycustomjson'
}