在阅读器中定义映射
Posted
技术标签:
【中文标题】在阅读器中定义映射【英文标题】:Define mapping in reader 【发布时间】:2014-10-23 08:46:24 【问题描述】:我已经定义了一个自定义 ComboBox 组件,我想在多个商店中重复使用它。它有一个简单的配置如下。
Ext.define('Myapp.CustomCombo',
extend: 'Ext.form.ComboBox',
valueField: 'id',
displayField: 'name'
);
模型是
Ext.define('Myapp.model.ComboModel',
extend: 'Ext.data.Model',
fields: [
name: 'id', type: 'int' ,
name: 'name', type: 'string' ,
name: 'linkCls', type: 'string'
]
);
我定义了多个商店,每个商店都有自己的代理配置并由唯一的 storeId 标识,如下所示
Ext.create('Myapp.store.EmployeeComboStore',
model: 'Myapp.model.ComboModel',
storeId: 'employeeLOVComboStore',
proxy:
type: 'rest',
url: '/employees/getLovData',
reader:
type: 'json',
rootProperty: 'data'
);
服务器响应如下 json 格式
"data" : [
"employeeId": 1, "employeeName": "Chris",
"employeeId": 2, "employeeName": "Jack",
]
我可以有多个这样的商店,例如具有不同代理 URL 的部门商店,并且服务器响应可能在哪里
"data" : [
"departmentId": 1, "departmentName": "Sales",
"departmentId": 2, "departmentName": "Marketing",
]
我想在 Reader 中定义一个映射,说明在不同的商店中以不同方式映射数据,例如..employeeId 应该映射到employeeStore 中的“id”和employeeName 到“name”,而departmentId 应该映射到'id' & departmentName 到 departmentStore 中的 'name'。
我已经看到有一些选项可以为模型中的每个字段定义映射,但我想,因为服务器使用来自关系数据库的数据进行响应,其中字段名称将是 columnNames .
【问题讨论】:
我想到了几个选项。 1.) 你能简单地将服务器上的数据转换成通用格式吗?如果希望将多个模型扁平化为相同的字段名称,最简单的方法是从服务器实际返回所需格式的数据。 2.) 如果您不想这样做,请记住,商店可以根据商店本身定义的 fields[] 配置动态创建隐式模型。这与源字段的映射相结合,可以让您将存储数据扁平化为通用字段架构。 【参考方案1】:您可以做的就是将metaData
从服务器发送到客户端。
json 响应可能如下所示:
data: [ ... ],
msg: "...",
total: 99,
metaData:
fields: [ ... ],
columns: [ ... ],
idProperty: "id",
messageProperty: "msg",
root: "data"
在你的情况下,如果 json 响应看起来像这样就足够了
data: [ ... ],
metaData:
fields: [
name: 'Id', type: 'int', mapping: 'departmentId' ,
name: 'Name', type: 'string', mapping: 'departmentName' ,
]
这也是一个很好的例子:Basic Meta Data Config
【讨论】:
以上是关于在阅读器中定义映射的主要内容,如果未能解决你的问题,请参考以下文章