Показать сообщение отдельно
  #1 (permalink)  
Старый 16.08.2013, 07:13
Новичок на форуме
Отправить личное сообщение для svgroz Посмотреть профиль Найти все сообщения от svgroz
 
Регистрация: 16.08.2013
Сообщений: 1

json, model, treegrid - странное поведение модели
Добрый день! Я новый в extjs, еще мало понимаю, но документацию читать умею. Бьюсь с проблемой 4й день.
Есть сервер, он выдает json, изменить его - нет возможности.
[{"WorkGroup":"Группа поддержки 3D",
        "Statistic":[
            {"Specialist":"Александр Константинович",
            "SCallCount":64,"AverageDuration":0.1136067,"leaf":true},
            {"Specialist":"Татьяна Алексеевна",
            "SCallCount":172,"AverageDuration":0.1058641,"leaf":true},
            {"Specialist":"Алексей Валентинович",
            "SCallCount":72,"AverageDuration":0.4269940,"leaf":true}]},
    {"WorkGroup":"Группа поддержки сервиса КСУП",
        "Statistic":[
            {"Specialist":"Руслан Евгеньевич",
            "SCallCount":67,"AverageDuration":0.1090698,"leaf":true},
            {"Specialist":"Алексей Алексеевич",
            "SCallCount":17,"AverageDuration":0.1125816,"leaf":true},
            {"Specialist":"Анна Владимировна",
            "SCallCount":172,"AverageDuration":0.0632347,"leaf":true},
            {"Specialist":"Мирослав Александрович",
            "SCallCount":315,"AverageDuration":0.0945766,"leaf":true},
            {"Specialist":"Николай Владимирович",
            "SCallCount":7,"AverageDuration":0.2342261,"leaf":true}]},
        ]}

Все бы заработало, переименуй я "Statistic" в "children", заменив "WorkGroup" и "Specialist" на одинаковые названия, но увы, нельзя. И не хочется. Хочется найти элегантное решение.
Дальше код модели
Ext.define('WorkGroupModel', {
   extend: 'Ext.data.Model',
    proxy: {
       type: 'rest',
       url: '/omnireports/ajaxgrid',
       reader: {
          type: 'json'
       }
     },
     fields: [{ name: 'text', mapping: 'WorkGroup' }],
     hasMany: { name: 'children', model: 'StatisticModel', associationKey: 'Statistic' }
})

Ext.define('StatisticModel', {
  extend: 'Ext.data.Model',
    fields: [
      { name: 'text', mapping: 'Specialist' },
      'SCallCount','AverageDuration',
      { name: 'leaf', defaultVale: true }
    ]
})

И маленький тест
WorkGroupModel.load(1, {
  success: function (wg) {
    console.log("WorkGroup: " + wg.get('text'));
      wg.children().each(function (specialist) {
        console.log("Specialist: " + specialist.get('text') + "\n leaf: " + specialist.get('leaf'));
      });
  }
});

Консоль FireBug
Код:
WorkGroup: Группа поддержки 3D
Specialist: Александр Константинович
 leaf: true
Specialist: Татьяна Алексеевна
 leaf: true
Specialist: Алексей Валентинович
 leaf: true
Т.е. обращение к элементам модели идет правильно - через text и children.
Далее...
Ext.define('basegrid', {
    extend: 'Ext.tree.Panel',
    xtype: 'tree-grid',
    title: 'Core Team Projects',
    height: 300,
    useArrows: true,
    rootVisible: false,
    multiSelect: true,
    singleExpand: false,
    initComponent: function () {
        this.width = 500;
        Ext.apply(this, {
            store: new Ext.data.TreeStore({
                model: WorkGroupModel,
                proxy: {
                    type: 'rest',
                    url: '/omnireports/ajaxgrid',
                    reader: {
                        type: 'json'
                    }
                },
                    autoLoad: true,
                    folderSort: true
                }),
            columns: [{
                xtype: 'treecolumn',
                text: 'Task',
                flex: 2,
                sortable: true,
                dataIndex: 'text'
            }]
        });
        this.callParent();
    }
});

И скриншот результата

Что я делаю не так? Как быть? А если у элемента будет большая вложенность?
Ответить с цитированием