2014-10-23 2 views
0

Я определил пользовательский компонент 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"}, 
] 
}  

я могу иметь несколько таких магазинов, как departmentStore с другой прокси URL и где, ответ сервера может быть

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

Я хочу, чтобы определить отображение в Reader, с инструкциями для отображения данных по-разному в разных магазинов, как в .. employeeId должен быть сопоставлен с «id» & employeeName для «name» в employeeStore, тогда как departmentId должен быть сопоставлен с «id» & departmentName для «name» в departmentStore.

Я видел, что существуют опции для определения отображения для каждого поля в модели, но я хотел бы определить отображение в Reader, так как сервер отвечает данными из реляционной базы данных, где имена полей будут columnNames.

+0

Пара вариантов приходит на ум. 1.) Можете ли вы просто преобразовать данные на сервере для получения обобщенного формата? Если желание состоит в том, чтобы свернуть несколько моделей в одни и те же имена полей, самым простым подходом было бы фактически вернуть данные с сервера, который находится в желаемом формате. 2.) Если вы не хотите этого делать, помните, что магазины могут иметь неявные модели, созданные «на лету» на основе конфигурации полей [], определенной в самом магазине. Это, в сочетании с сопоставлениями для исходных полей, позволит вам сгладить данные хранилища в общую архитектуру поля. – existdissolve

ответ

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

Смежные вопросы