ExtJS 在网格中加载嵌套的 JSON 数据

Posted

技术标签:

【中文标题】ExtJS 在网格中加载嵌套的 JSON 数据【英文标题】:ExtJS loading nested JSON data in grid 【发布时间】:2014-03-05 11:30:41 【问题描述】:

我有一个 php 脚本,它返回以下 JSON

[
   
      "Code":0,
      "Message":"No problem"
   ,
   
      "name":"o016561",
      "status":1,
      "locks":[
         
            "ztn":"155320",
            "dtn":"20131111",
            "idn":"78"
         ,
         
            "ztn":"155320",
            "dtn":"20131111",
            "idn":"91"
         
      ]
   ,
   
      "name":"o011111",
      "status":1,
      "locks":[
         
            "ztn":"155320",
            "dtn":"20131111",
            "idn":"91"
         
      ]
   ,
   
      "name":"o019999",
      "status":0,
      "locks":[

      ]
   ,
   
      "name":"o020000",
      "status":0,
      "locks":[

      ]
   ,
   
      "name":"o020001",
      "status":0,
      "locks":[

      ]
   
]

编辑: 网格应如下所示:

我已经能够将 namestatus 加载到我的网格中 - 到目前为止一切顺利。但更重要的部分是,我需要将locks-array 中的嵌套数据加载到我的网格中,但我无法让我的代码正常工作。任何帮助将不胜感激。

如果这很重要,我正在使用 ExtJS 4.2。

编辑 2:

我试过了

Ext.define("Locks", 
    extend: 'Ext.data.Model',
    fields: [
        'ztn',
        'dtn',
        'idn'
    ]
);

Ext.define("ConnectionModel", 
    extend: 'Ext.data.Model',
    fields: ['name', 'status'],
    hasMany: [
        model: 'Locks',
        name: 'locks'
    ]
);

var store = Ext.create('Ext.data.Store', 
    model: "ConnectionModel",
    autoLoad: true,
    proxy: 
        type: 'ajax',
        reader: 
            type: 'json',
            root: 'name'
        
    
);

但它似乎在很多方面都是错误的...... 如果ztndtn 可以在同一列中以空格分隔,那就太棒了

【问题讨论】:

网格应该是什么样子的?哪些栏目? @Indianer 我刚刚编辑了原帖 把你的模型定义放在这里.. 您有一个可能被锁定的项目数组,但是在您的网格中它显示 ztn + dtn,您是否要将数组中的所有相应值相加到该字段中? 【参考方案1】:

您可以在列中添加renderer。在该渲染器中,您可以对记录执行任何操作...

这是一个有效的小提琴: http://jsfiddle.net/Vandeplas/MWeGa/3/

Ext.create('Ext.grid.Panel', 
    title: 'test',
    store: store,
    columns: [
        text: 'Name',
        dataIndex: 'name'
    , 
        text: 'Status',
        dataIndex: 'status'
    , 
        text: 'idn',
        renderer: function (value, metaData, record, rowIdx, colIdx, store, view) 
            values = [];
            record.locks().each(function(lock)
                values.push(lock.get('idn'));
            );
            return values.join('<br\>');
        
    , 
        text: 'ztn + dtn',
        renderer: function (value, metaData, record, rowIdx, colIdx, store, view) 
            values = [];
            record.locks().each(function(lock)
                values.push(lock.get('ztn') + ' ' + lock.get('dtn'));
            );
            return values.join('<br\>');
        
    ],
    height: 200,
    width: 600,
    renderTo: Ext.getBody()
);

注意

如果您可以控制您的后端,您最好更改数据的形式,如下所示:


    "code": 0,
    "message": "No problem",
    "success": true,
    "data": [
        
            "name": "o016561",
            "status": 1,
            "locks": [
                
                    "ztn": "155320",
                    "dtn": "20131111",
                    "idn": "78"
                ,
                
                    "ztn": "155320",
                    "dtn": "20131111",
                    "idn": "91"
                
            ]
        ,
        
            "name": "o011111",
            "status": 1,
            "locks": [
                
                    "ztn": "155320",
                    "dtn": "20131111",
                    "idn": "91"
                
            ]
        
    ]

这样您就不会将您的控制数据(成功、消息、代码......)与您的数据混合在一起,并且代理会正确地提取它(这可能是您遇到问题的原因)。我添加了一个成功布尔值 => Ext 将其拾取并转到失败处理程序。它对您的异常处理有很大帮助。

这是它的代理:

proxy: 
    type: 'ajax',
        api: 
        read: ___URL____
    ,
    reader: 
        type: 'json',
        root: 'data',
        messageProperty: 'message'
    

【讨论】:

好吧...出现了一些意想不到的Uncaught TypeError: Cannot read property 'Container' of undefined 。我对 ExtJS 很陌生,所以这是什么意思? 在我的例子中?奇怪..我无法重现它......基本上它的意思是:你有一个对象,例如; a 你尝试做a.Container => 但aundefined 所以它没有属性Container.. 大部分时间不是因为缺少逗号或一些愚蠢的东西...... 如果它在恢复到该点并插入 2 列之前有效 aah 这是一些 n00bish 拼写错误...非常感谢您提供的其他答案! @VDP您能否提出一个不使用渲染器的解决方案。我们不能以某种方式使用 dataIndex 吗?

以上是关于ExtJS 在网格中加载嵌套的 JSON 数据的主要内容,如果未能解决你的问题,请参考以下文章

extjs 嵌套数据网格过滤器和重新加载在 viewModel 上不起作用

ExtJS json 存储未填充

ExtJs如何在Window窗口中加载页面上的GridPanel??

EXTJS 4 嵌套 json 数组数据到网格面板

ExtJS 组合框未在面板中加载

无法在 ExtJS4 中加载组合存储