【问题标题】:Grid rows with nested data from loaded store带有来自已加载存储的嵌套数据的网格行
【发布时间】:2013-03-28 09:27:26
【问题描述】:

我有一个加载了参数的数据视图。我在模板中呈现这些数据。我正在尝试使用相同的数据,其中存在要呈现到网格的嵌套项。

数据如下:

{
    "myJson": {
        "name": "abc",
        "type": "faulty",
        "notes": [
            {
                "date": "01-01-1970",
                "note": "test note"
            },
            {
                "date": "01-02-1970",
                "note": "test note 2"
            }
        ]
    }
}

商店:

proxy: {
                type: 'ajax',
                url: '/api/detail/',
                reader: {
                    type: 'json',
                    root: 'myJson'
                }
            }

型号:

    {
        name:'name',
    },
    {
        name:'type',
    },
    {
        name:'notes',
        mapping:'notes'
    },

模板:

{name} - {type}

一切正常。我想做的是使用notes 块在网格中显示。问题是我无法让它阅读笔记组。

var notesListView = new Ext.list.ListView({
    store: 'myStore',
    multiSelect: false,
    width:'100%',
    id:'notesList',
    columns: [{
        header: 'Date',
        width: 75,
        dataIndex: 'date'
    },{
        header: 'Note',
        width: 150,
        dataIndex: 'note',
    }]
});

甚至有可能做到这一点吗?还是我需要创建一个新的商店和模型才能在网格中使用这组数据?

例如,我尝试在两个模型中映射到 notes.date

name:'note_date',
mapping:'notes.date'

在网格本身中

dataIndex:'notes.date'

两者都不起作用。

我也尝试过使用renderer,但这也不起作用,因为它是一个数组

renderer:function(value, metaData, record, rowIndex, colIndex, store){
    var value = value.date;//won't work; it needs an index a la value[0].date
    return value;
}

【问题讨论】:

  • 因为两者都不正确。你不能引用notes.date,因为notes是一个数组。
  • 感谢您的帮助:/

标签: extjs extjs4


【解决方案1】:

您可以使用收到的相同数据创建嵌套模型。应该是这样的

Ext.define("JsonModel", {
  extend: 'Ext.data.Model',
  fields: ['name','type'],
  hasMany: [{
      model: 'Note',
      name: 'notes'
  }]
});

Ext.define("Note", {
  extend: 'Ext.data.Model',
  fields: [
      'date',
      'note']
});

这样你就可以像这样访问任何给定记录的孩子

var jsonRecordChildren = jsronRecord.notes()

我刚刚创建的变量 jsonRecordChildren 属于 Store 类型,因此您可以轻松地将其分配给网格的属性存储。

Ext.create('Ext.grid.Panel', {
  store: selectedRecord.notes(),
  columns: [
      { text: 'Date',  dataIndex: 'date' },
      { text: 'Note', dataIndex: 'note'}
  ],
  renderTo: Ext.getBody()
});

http://jsfiddle.net/alexrom7/rF8mt/2/

【讨论】:

  • 感谢您的回复。而对于小提琴。希望它不涉及hasMany,因为我似乎永远无法让那些工作......在小提琴中工作,但在带有ajax代理的应用程序中,无论我尝试什么,应用程序都找不到notes():/
  • 这可能会对您有所帮助。 stackoverflow.com/questions/8134420/…
  • 呵呵,谢谢 :) 我尽职尽责;在抱怨我无法理解之前,我想知道很多 SO 帖子。不知道是因为模型和商店在嵌套文件夹中还是什么。尝试了我能找到的所有建议(甚至尝试将代理移动到模型中)。当我记录 selectedRecord 时,控制台会记录一个构造函数(缺少 notesStore),而在小提琴中它会记录一个存储完整的对象。
  • chrome 控制台会报错吗? hasManyname 属性是否与您的 json 的 notes 节点匹配?你的模型正在加载吗?你能打破我做的 jsfiddle 让它看起来更像你的代码吗?,我不认为 ajax 代理是问题,但是有一种方法可以在 jsfiddle 中模拟它。
  • 错误类似于Object [object Object] has no method 'notes'。正如我所说,模型和商店嵌套在文件夹中,被称为类似于“MyApp.model.People.Notes”。 hasMany 名称确实与 notes 节点匹配,但找不到 notes()。另一个很大的区别是商店通过 onChange 在另一个元素上加载了一个参数。我试图在商店加载的成功回调上调用这个网格代码,它被触发了,但 getAt(0) 似乎总是返回一个没有注释() 的构造函数。我最终做了其他事情,但非常感谢帮助:)
猜你喜欢
  • 2016-01-07
  • 2011-11-25
  • 2018-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-18
  • 1970-01-01
  • 2021-06-23
相关资源
最近更新 更多