【问题标题】:Treestore empty - is JSON valid?Treestore 为空 - JSON 有效吗?
【发布时间】:2012-08-05 14:36:17
【问题描述】:

我的代码看起来像这样,但存储/树中没有数据。

JSON 存储有效吗?我需要在 JSON 上添加root 吗?

必须在树面板中定义哪些列?

JSON:

{
   "status" : {
      "status" : 0,
      "msg" : "Ok",
      "protocolversion" : "1.1.json"
   },
   "value" : {
      "name" : "Root",
      "path" : "\/",
      "leaf" : false,
      "children" : [
            {
               "name" : "subfolder1",
               "path" : "\/subfolder1",
               "leaf" : false,
               "children" : []
            },
            {
               "name" : "subfolder2",
               "path" : "\/subfolder2",
               "leaf" : false,
               "children" : []
            },
            {
               "name" : "report1",
               "path" : "\/report1",
               "leaf" : true,
               "children" : []
            }
         ]
   }
}

我的 ExtJs 代码:

型号:

// Model for store
     var oModel = Ext.define('TreeModel', {
        extend: 'Ext.data.Model',
        fields: [
           { name: 'name',         type: 'string' },
           { name: 'path',         type: 'string' }
        ]
     });

商店:

     // Store with local proxy
     var oStore = Ext.create('Ext.data.TreeStore', {
        model: oModel,
        autoLoad: true,
        proxy: {
           type  : 'ajax',
           url   : './data/response.json'
        },
        reader: {
           type  : 'json',
           root  : 'value'
        }
     }); 

树形面板:

     // View with TreePanel
     var oTreePanel = Ext.create( 'Ext.tree.Panel', {
        store       : oStore,
        useArrows   : true,
        displayField: 'text',
        rootVisible : true,
        multiSelect : true,
        border      : 0,
        columns     : [
           {
              xtype    : 'treecolumn',
              dataIndex: 'name',
              text     : 'Tree',
              flex     : 3
           },
           {
              dataIndex: 'path',
              text     : 'Path',
              flex     : 2
           }
        ]
     } );

【问题讨论】:

  • 对我来说几乎所有东西都不错,但是 root 和 children 属性需要相同,所以我首先将您的 json 响应中的 value 更改为 children,并定义 root您的读者为children。让我知道结果。
  • 谢谢!在我的 json 中将 value 更改为 children 解决了它! 1. 你能解释一下为什么一定要children吗? 2、那我的TreeStore中的root: 'value'有什么作用呢? 3.发布一个答案,我会接受它。

标签: json extjs tree store


【解决方案1】:

您需要在 json 和阅读器的根目录中将 value 更改为 children

思考的方式是这样的:阅读器的根告诉阅读器记录数据从哪里开始。但是因为树数据是嵌套的(一个节点可以有子节点)ExtJS 在每个节点中寻找另一个根(然后在后一个节点中寻找另一个根,以此类推)。

因此,如果您将阅读器的根称为“children”,它会在具有children 节点的节点中找到子节点。

你同样可以称它为“subs”或“whatever”;你只需要确保在整个层次结构中使用相同的东西,包括 json 数据的根。

【讨论】:

    【解决方案2】:

    这是一个树面板的示例,我能够使用“数据”作为子级在 MVC 结构中获得功能:

    JSON:

    Ext.data.JsonP.callback4({
        "message": "", "data": [
          {
              "descr": "TEST REASON",
              "leaf": false,
              "data": [
                {
                    "descr": "TEST REASON",
                    "leaf": true,
                    "data": null
                }
              ]
          },
          {
              "descr": "Another Type Code",
              "leaf": false,
              "data": []
          },
          {
              "descr": "Quite A Different One I Think",
              "leaf": false,
              "data": [
                {
                    "descr": "A Child Of That",
                    "leaf": true,
                    "data": null
                }
              ]
          }
        ]
    })
    

    型号:

    Ext.define('App.model.treePanel', {
        extend: 'Ext.data.Model',
        fields: [
            { name: 'descr', type: 'auto' },
            { name: 'leaf', type: 'auto' }
        ],
        proxy: {
            type: 'jsonp',
            url: 'yourURL',
            //extraParams: {
            //},
            headers: { 'Content-type': 'text/json;  charset=utf-8', 'Accepts': 'text/json' },
            reader: {
                type: 'json',
                root: 'data',
                successProperty: 'success'
            }
        }
    });
    

    商店:

    Ext.define('App.store.treePanels', {
        extend: 'Ext.data.TreeStore',
        model: 'App.model.treePanel'
    });
    

    查看:

    Ext.define('App.view.treePanel', {
        extend: 'Ext.tree.Panel',
        xtype:'treePanel',
        title: 'My Items',
        store: 'treePanels',
        rootVisible: false,
        //hideHeaders:true,
        columns: [
            {
                xtype: 'treecolumn',
                dataIndex: 'descr',
                text: 'Current Types and Reasons',
                flex: .5
            }
        ],
        tbar:{
            items: [
                {
                    xtype: 'button',
                    text: 'Remove Item'
                },
                {
                    xtype: 'button',
                    text:'Edit Item'
                }
                ]
        }
    });
    

    请注意:rootVisible:false 是必需的。

    【讨论】:

    • 另请注意,我的请求是 jsonp 而不是 ajax
    猜你喜欢
    • 2011-09-09
    • 1970-01-01
    • 1970-01-01
    • 2021-09-12
    • 1970-01-01
    • 2012-11-15
    • 1970-01-01
    • 2011-08-04
    • 1970-01-01
    相关资源
    最近更新 更多