Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #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();
    }
});

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

Что я делаю не так? Как быть? А если у элемента будет большая вложенность?
Ответить с цитированием
  #2 (permalink)  
Старый 16.08.2013, 11:36
Профессор
Отправить личное сообщение для novikov Посмотреть профиль Найти все сообщения от novikov
 
Регистрация: 19.11.2012
Сообщений: 178

Если вы работаете с версией ExtJs 4.2, то модель лучше унаследовать от Ext.data.TreeModel.
Ответить с цитированием
  #3 (permalink)  
Старый 16.08.2013, 11:45
Профессор
Отправить личное сообщение для novikov Посмотреть профиль Найти все сообщения от novikov
 
Регистрация: 19.11.2012
Сообщений: 178

Не тестировал это решение для вашего случая, но связанные модели здесь, как мне кажется не нужны. Лучше попробовать извлекать данные в нужное поле при помощи функции, переданой в параметре convert настроек поля.

Ext.define('MyTreeItemModel', {
   extend: 'Ext.data.TreeModel',
    proxy: {
       type: 'rest',
       url: '/omnireports/ajaxgrid',
       reader: {
          type: 'json'//,
          //root: 'Statistic'
       }
     },
     fields: [
         { 
               name: 'text', 
               convert(value, record) {
                    if (record.data.Specialist) {
                         return record.data.Specialist;
                    }
                    if (record.data.WorkGroup) {
                         return record.data.WorkGroup;
                    }
              }
         }
    ]
})


Если нет желания менять серверный код, то подготовить данные к вставке в Ext.data.TreeStore можно и на клиенте. У библиотеки есть необходимые средства. Загрузка в стор затем через loadData(). Элегеантно или нет такое решение, судить вам.

Последний раз редактировалось novikov, 16.08.2013 в 12:21.
Ответить с цитированием
  #4 (permalink)  
Старый 16.08.2013, 12:04
Профессор
Отправить личное сообщение для novikov Посмотреть профиль Найти все сообщения от novikov
 
Регистрация: 19.11.2012
Сообщений: 178

Почему вы опредилили proxy и в сторе, и в модели?

Последний раз редактировалось novikov, 16.08.2013 в 12:15.
Ответить с цитированием
  #5 (permalink)  
Старый 16.08.2013, 12:10
Профессор
Отправить личное сообщение для novikov Посмотреть профиль Найти все сообщения от novikov
 
Регистрация: 19.11.2012
Сообщений: 178

Обратите внимание ещё вот на этот документ:

http://docs.sencha.com/extjs/4.2.1/#....NodeInterface

К записям, которые вы загрузили в древовидный стор, автоматически добавляются некоторые поля: expanded, loaded и проч.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Странное поведение $(document).ready nicepayqsc122 jQuery 3 05.06.2013 14:03
backbone - модели и json torsar Библиотеки/Тулкиты/Фреймворки 1 12.02.2013 15:26
insertBefore и insertAfter странное поведение с html Viper jQuery 0 07.02.2012 17:36
Странное поведение переменной mycoding Серверные языки и технологии 4 14.01.2011 19:18
Странное поведение replace cooli0 Общие вопросы Javascript 4 25.01.2010 17:16