2012-06-27 2 views
0

Я пытаюсь загрузить вложенную JSONData в мою сетку деревьев. При первом вызове получения данных все данные, необходимые для заполнения сетки, возвращаются в ответе как объект JSON. Однако я вижу, что он все еще пытается получить данные для всех родительских объектов в сетке.Загрузка вложенных данных JSON в ExtJS4 TreeGrid

Даже после ложных GET, он все еще не может заполнить дочерние узлы.

Я определил 2 модели, родителю с «hasMany» отношения со ссылкой на дочернюю модель, и дочерний узел с «BelongsTo» отношения со ссылкой на родительской модели

Я использую Ajax Proxy с читателем JSON.

Поиск в Интернете Я не могу найти много информации, и я использовал пример user-orderitems-products в документации extJS, чтобы попытаться настроить мои модели и дерево.

Я не совсем уверен, чего мне не хватает. Любая помощь будет высоко оценена.

JSON (человек может или не может иметь детей объекты):

People: { 
{firstName: john, id:123, uniqueID:1231, leaf:true}, 
{firstName: jane, id:124, uniqueID:1240, 
    offspring:[ 
    {firstName: adam, id:124, uniqueID:1241, leaf:true}, 
    {firstName: brandon, id:124, uniqueID:1242, leaf:true}, 
    {firstName: claire, id:1243, uniqueID:1243, leaf:true} 
]} 
} 

Модель:

Ext.define('Person',{ 
    extend: 'Ext.data.Model', 
    fields: [ 
    {name: 'firstName', type:'string'}, 
    {name: 'uniqueID', type:'float'} 
    hasMany: { 
     model:'Offspring', 
     name: 'Offspring', 
     associationKey: 'offspring', 
     primaryKey: 'uniqueID', 
     foreignKey: 'id' 
    } 
    ], 
    proxy: { 
    type: 'rest', 
    url: 'http://blah/blah', 
    reader: { 
    type: 'json', 
    root: 'People' 
    } 

    } 
}); 

Ext.define('Offspring',{ 
    extend: 'Ext.data.Model', 
    fields: [ 
    {name: 'firstName', type:'string'}, 
    {name: 'uniqueID', type:'float'} 
], 
belongsTo: 'Person' 
}); 

магазин Определение:

var store = Ext.create('Ext.data.TreeStore', { 
    model: 'Person', 
    folderSort: true 
} 
+0

Не могли бы вы показать нам ответ JSON и определение модели? – Izhaki

+0

Добавлен код сейчас. – Babyangel

ответ

2

Я подозреваю, что вы можете ввести в заблуждение простую связь между родителем и ребенком с отношениями hasMany.

Но для вашего первоначального вопроса. Вы возвращаете узел (jane), который не является листом, но не имеет детей. Поскольку ваш прокси-корень для Person равен People, дочерняя собственность также должна быть people.

Я считаю, что следующий JSON будет работать для вас:

People: { 
    {firstName: john, id:123, uniqueID:1231, leaf:true}, 
    {firstName: jane, id:124, uniqueID:1240, 
    People:[ 
     {firstName: adam, id:124, uniqueID:1241, leaf:true}, 
     {firstName: brandon, id:124, uniqueID:1242, leaf:true}, 
     {firstName: claire, id:1243, uniqueID:1243, leaf:true} 
    ]} 
} 

Вот рабочий код:

Модель:

Ext.define('BS.model.ItemCategory', { 
    extend: 'Ext.data.Model', 
    fields: [ 
     {name: 'name'  , type: 'string'}, 
     {name: 'iconCls' , type: 'string', defaultValue: 'treenode-no-icon'}, 
     {name: 'leaf'  , type: 'boolean', defaultValue: false}, 
     {name: 'expanded' , type: 'boolean', defaultValue: true, persist: false}, 
     {name: 'index'  , type: 'int'},   
    ], 

    proxy: { 
     type: 'direct', 

     api: { 
      create: ItemCategories.Create, 
      read: ItemCategories.Read, 
      update: ItemCategories.Update, 
      destroy: ItemCategories.Destroy, 
     }, 
    }, 

}); 

Магазин:

Ext.define('BS.store.ItemCategories', { 

    extend: 'Ext.data.TreeStore',  
    model: 'BS.model.ItemCategory', 

    autoSync: true, 

    root: { 
     text: 'Root', 
     id: 'NULL', 
     expanded: true 
    }, 

    clearOnLoad: true, 
}); 

JSON :

"result":{ 
    "success":true, 
    "children":[ 
    { 
     "id":"1", 
     "parentId":null, 
     "name":"DFM", 
     "index":"0", 
     "deleted":"0", 
     "children":[ 
      { 
       "id":"6", 
       "parentId":"1", 
       "name":"Studios", 
       "index":"0", 
       "deleted":"0", 
       "loaded":true, 
       "leaf":false 
      }, 
      { 
       "id":"7", 
       "parentId":"1", 
       "name":"Equipment", 
       "index":"1", 
       "deleted":"0", 
       "children":[ 
       { 
        "id":"18", 
        "parentId":"7", 
        "name":"Cameras", 
        "index":"0", 
        "deleted":"0", 
        "loaded":true, 
        "leaf":false 
       }, 
       { 
        "id":"20", 
        "parentId":"7", 
        "name":"Tripods", 
        "index":"1", 
        "deleted":"0", 
        "loaded":true, 
        "leaf":false 
       }, 
       { 
        "id":"26", 
        "parentId":"7", 
        "name":"Lighting Kits", 
        "index":"2", 
        "deleted":"0", 
        "loaded":true, 
        "leaf":false 
       } 
       ], 
       "leaf":false 
      } 
     ], 
     "leaf":false 
    }, 
    { 
     "id":"3", 
     "parentId":null, 
     "name":"3D", 
     "index":"2", 
     "deleted":"0", 
     "loaded":true, 
     "leaf":false 
    } 
    ] 
} 
+0

Когда я пытаюсь, я получаю: «node undefined». когда он разбирает метод appendChild и пытается сделать oldParent = node.parentNode – Babyangel

+0

Даже если я добавлю «людей» в качестве дочернего узла и удаляю его, многие из них относятся к определениям в модели, я все равно получаю ошибку. – Babyangel

+0

Это, скорее всего, из-за того, что ExtJS не обертывает модель с помощью NodeInterface. Не могли бы вы попробовать загрузить через магазин, который расширяет 'Ext.data.TreeStore'? – Izhaki

1

Там пример именно это в SDK скачать: http://dev.sencha.com/deploy/ext-4.1.0-gpl/examples/tree/treegrid.html

+0

Я начал с этого в качестве кода шаблона. Я пытаюсь понять, почему я не могу получить свое дерево для отображения события, хотя пример. – Babyangel

+0

Даже после того, как я отформатирую свой JSON так, чтобы он выглядел как JSON в этом примере (используя текст: «.» И дочернее имя «children»), я все еще получаю неопределенную ошибку узла. – Babyangel

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