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

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

有没有一种方法可以在Ext JS中配置数据存储,以便可以区分实际的模型类型?因此,在我的情况下,列表应包含几个SuperCustomerDto和几个CustomerDto

最佳答案

在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/

09-17 13:20