在阅读器中定义映射

时间:2014-10-23 08:46:24

标签: extjs jsonreader

我已经定义了一个自定义的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的departmentStore,以及服务器响应可能在哪里

{
"data" : [
    {"departmentId": 1, "departmentName": "Sales"},
    {"departmentId": 2, "departmentName": "Marketing"},
]
}

我想在Reader中定义一个映射,其中包含在不同商店中以不同方式映射数据的说明,例如:employeeId应该映射到' id' &安培; employeeName to' name'在employeeStore中,而departmentId应映射到' id' &安培; departmentName to' name'在departmentStore。

我已经看到有为模型中的每个字段定义映射的选项,但我想在Reader中定义映射,因为服务器使用关系数据库中的数据进行响应,其中字段名称将是columnNames。

1 个答案:

答案 0 :(得分: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