如何(正确)使用RowExpander在网格中呈现其他数据

时间:2012-07-11 20:40:27

标签: javascript extjs extjs4.1

我正在尝试在网格中的rowbody中渲染一些数据(使用RowExpander插件)。 我的问题是ol'rowBodyTpl对我来说还不够,因为这些数据来自正在渲染的记录中的商店记录(嗯......)。

简单地说:网格的每个记录都有一个商店(我们称之为商品)。所以,我想渲染记录数据以及 Items 记录的一些数据。

最好的(ish)方式是什么?

覆盖renderer插件的rowexpander功能,覆盖getAdditionalData,还是不覆盖这些功能?

谢谢。

4 个答案:

答案 0 :(得分:1)

我知道这个问题已有几年了,但这是我目前用来处理这种情况的一个技巧。它利用了XTemplates允许的“逐字”块。这些允许您通过用{% ... %}包装它来在XTemplate中执行任意代码。在这些代码块中,this被设置为XTemplate本身。 XTemplate具有owner属性,在我们的示例中,它引用了RowExpander插件本身,而该插件又具有grid属性来引用网格。因此,类似这样的内容允许您将任意数据添加到传递给rowBodyTpl的值。

Ext.create('Ext.grid.Panel', {
    ...
    injectRowBodyData: function(values) {
        values.MyInjectedContent = "Here's some extra data!";
    },
    plugins: [
        {
            ptype: 'rowexpander',
            rowBodyTpl: [
                '{% this.owner.grid.injectRowBodyData(value); %}',
                '<div>',
                    '<h1>{Title}</h1>',
                    '<p>{Content}</p>,
                    '<p>{MyInjectedContent}</p>',
                '</div>'
            ]
        }
    ]
});

Hhopefully Sencha将修复插件以提供一种方法来处理这个问题。但是现在这很好用。我使用v4.2.1.883对此进行了测试,但这应该适用于Ext 4的任何先前版本。我能想到的唯一可能阻止它在将来工作的是XTemplate的owner属性不再存在指向插件,或插件没有引用带有grid属性的网格。

答案 1 :(得分:0)

我如何“解决”这个问题,它可能对其他人有所帮助:

我覆盖了rowexpander插件的 getRowBodyFeatureData ,因为这个函数不仅接收要在模板上应用的数据,还接收记录本身,所以我只是data添加了记录中的额外商店/数组。

不确定它是否是最佳方式,但嘿......至少它是否有效。

答案 2 :(得分:0)

您还可以在if else中使用rowBodyTpl语句:

检查&#34;:&#34;

"<tpl if='phone == \":\"'>",
"<tpl else>",
"</tpl>"

检查空字符串

"<tpl if='phone == \"\"'>",
"</tpl>"

此示例取自此处:link

答案 3 :(得分:-1)

这就是我通常做的事情:

Ext.create('Ext.grid.Panel',{
border: true,
store: 'ds',
    columns: []
    plugins: [{
            ptype: 'rowexpander',
            rowBodyTpl : ['<p><b>Title:</b>{name}<br/><b>Description:</b> {description}<br/><b>Experiment Design:</b> {experimentdesign}</p>']
    }],
    renderTo: 
});