【问题标题】:Distinguish model type while deserializing json data in Ext JS store在 Ext JS 存储中反序列化 json 数据时区分模型类型
【发布时间】:2025-12-18 06:55:02
【问题描述】:

在 Ext JS 中,我使用 JSON 阅读器存储数据。 我从服务器端的类生成模型,具有相同的层次结构 - 例如。在服务器上,我有 CustomerDto 类,它扩展了 BaseDto 类; 在客户端,我也有 CustomerDto 扩展 BaseDtoBaseDto 扩展 Ext.data.Model

假设我用模型SuperCustomerDto(扩展CustomerDto)定义数据存储,并从服务器发送SuperCustomerDtoCustomerDto的混合列表,它们总是反序列化为CustomerDto

有没有办法在 Ext JS 中配置数据存储,以便区分实际模型类型?所以在我的案例列表中应该包含很少的SuperCustomerDto 和很少的CustomerDto

【问题讨论】:

    标签: javascript extjs deserialization extjs4.2 extjs5


    【解决方案1】:

    在 Ext JS 5 中,您可以设置 typeProperty,这将指示要创建的模型的类型。

    示例商店:

    var store = Ext.create('Ext.data.Store', {
        model: 'CustomerDto',
        proxy: {
            type: 'memory',
            reader: {
                type: 'json',
                typeProperty: 'cls',
                rootProperty: 'data'
            }
        }
    });
    

    示例数据:

    [
        { cls: 'CustomerDto',      id: 1, a: 'a' },
        { cls: 'SuperCustomerDto', id: 2, a: 'a', b: 'b' }
    ]
    

    如果typeProperty 设置为cls,阅读器会将第一个数组元素转换为CustomerDto,第二个转换为SuperCustomerDto

    在 5 AFAIK 之前的 Ext JS 中,没有内置支持。要模仿这种行为,您应该重写 Ext.data.reader.Reader.extractData 方法。

    工作样本:http://jsfiddle.net/b2LS5/1/

    【讨论】: