2014-06-04 3 views
1

У меня возникли проблемы с загрузкой очень простого json, где узлы вложены внутри «данных», как показано ниже. Я ожидаю получить два узла с текстом AAA и BBB, но я получаю только дерево с несколькими пустыми узлами с бесконечными дочерними элементами (каждый ребенок с одним дочерним дочерним элементом).Extjs, не может прочитать простой json внутри treepanel

test_lrymgr.json

{ 
    "data": [ 
     { 
      "text": ".", 
      "children": [ 
       { 
        "nodename": "AAA", 
        "isvisible": true, 
        "expanded": false   
       }, 
       { 
        "nodename": "BBB", 
        "isvisible": true, 
        "expanded": false 
       } 
      ] 
     } 
    ], 
    "metadata": { "success":true, "msg":"", "totalCount":1, "totalPages":1, "prevLink":"", "nextLink":""} 
} 

test_lrymgr.html

<html> 
<head> 

    <link rel="stylesheet" type="text/css" href="ext/packages/ext-theme-classic/build/resources/ext-theme-classic-all.css" /> 
    <script type="text/javascript" src="ext/ext-all-debug.js"></script> 
</head> 
<body> 

<script type="text/javascript"> 
    Ext.onReady(function() { 

     try { 

      //define model 
      Ext.define('MyDataModel', { 
       extend: 'Ext.data.Model', 

       fields: [ 
        { name: 'nodename', mapping: 'nodename' }, 
        { name: 'isvisible', mapping: 'isvisible' } 
       ], 

      }); 

      //define store 
      Ext.define('MyStore', { 
       extend: 'Ext.data.TreeStore', 

       storeId: 'idStoreLryManager', 
       model: 'MyDataModel', 

       proxy: { 
        type: 'ajax', 
        url: 'test_lrymgr.json', 
        reader: { 
         type: 'json', 
         root: 'data', 
         metaProperty: 'metadata', 
         totalProperty: 'metadata.totalCount', 
         successProperty: 'metadata.success', 
         messageProperty: 'metadata.msg' 
        }, 
       } 
      }); 

      //define tree panel 
      Ext.define('MyTreePanel', { 
       extend: 'Ext.tree.Panel', 
       alias: 'widget.myTreePanel', 

       store: 'MyStore', 

       rootVisible: false, 
       columns: [ 
        { 
         xtype: 'treecolumn', 
         dataIndex: 'nodename', 
         sortable: false, 
         flex: 2, 
         header: '' 
        }, 
        { 
         xtype: 'checkcolumn', 
         dataIndex: 'isvisible', 
         sortable: false, 
         width: 55, 
         header: 'Visible' 
        } 
       ] 
      }); 


      //create tree view 
      var storeInstance = Ext.create('MyStore'); 
      Ext.createWidget('window', { 
       title: 'test', 
       layout: 'fit', 
       autoShow: true, 
       height: 360, 
       width: 200, 
       items: { 
        xtype: 'myTreePanel', 
        store: storeInstance, 
        border: false 
       } 
      }); 

      //load    
      storeInstance.load({ 
       scope: storeInstance, 
       callback: function (records, operation, success) { 

        try { 
        } 
        catch (ex) { 
         Ext.Msg.alert("", "callback error: " + ex); 
        } 
       } 
      }); 

     } 
     catch (ex) 
     { 
      Ext.Msg.alert("", ex) 
     } 
    }); 



</script> 
</body> 
</html> 

Любая идея о том, что это не так? ...

ответ

1

Ваш JSON над здесь wrong.Root упоминается в магазин «данные». Так Ваш json должен быть примерно таким:

{ 
    "data": [{ 
    "nodename": "child1", 
    "data": [{ 
     "nodename": "subChild1", 
     "expanded": false, 
     "leaf": true 
    }, { 
     "nodename": "subChild2", 
     "expanded": false, 
     "leaf": true 
    }] 
}], 
    "metadata": { 
    "success": true, 
    "msg": "", 
    "totalCount": 1, 
    "totalPages": 1, 
    "prevLink": "", 
    "nextLink": "" 
    } 
} 

Для дерева, чтобы читать вложенные данные, то Ext.data.reader.Reader должен быть сконфигурирован с корневым свойством, так что читатель может найти вложенные данные для каждого узла (если корень не указанный, он будет по умолчанию «детьми»). Это скажет дереву искать любые вложенные узлы дерева по одному и тому же ключевому слову, т. Е. «Дети». Если в конфигурации указан корень, убедитесь, что все вложенные узлы с детьми имеют одинаковое имя. Обратите внимание, что установка defaultRootProperty выполняет то же самое:.

+0

Спасибо за ответ, теперь я лучше понимаю. Только последняя проблема: если я устанавливаю rootVisible: false, то я получаю два корневых узла с текстом «child1» (используя ваш json). Знаете ли вы, почему? ... – Franz

+0

Если вы удовлетворены ответом, вы можете пометить его как ответ. ;-) – Dev

+0

Извините за глупый вопрос: как я могу отметить, как ответил? Я попытался проголосовать за ваш ответ, но мой рейтинг репутации слишком низок (я здесь новый ...) – Franz