ExtJS 4 GridView-如何获取单元格';是td还是div?

ExtJS 4 GridView-如何获取单元格';是td还是div?,view,grid,cell,extjs4,View,Grid,Cell,Extjs4,在GridPanel中,我们都知道可以在列配置中指定渲染器,以自定义单元格。现在有一个特殊情况,我需要构建一个定制的可视进度条(画布)来绘制到单元格中,我的问题是如何获得单元格的el 在渲染器回调中,可用的值有值、元数据、记录、行索引、列索引、存储和查看。我尝试了view.getNode或view.getCell,但仍然没有成功 提前谢谢你 /莱昂内尔 编辑 在进一步挖掘之后,我意识到在调用渲染器时,我的节点实际上还没有准备好,即视图。getNode和视图。getCell实际上正在工作,但延迟了

在GridPanel中,我们都知道可以在列配置中指定
渲染器
,以自定义单元格。现在有一个特殊情况,我需要构建一个定制的可视进度条(画布)来绘制到单元格中,我的问题是如何获得单元格的
el

在渲染器回调中,可用的值有
元数据
记录
行索引
列索引
存储
查看
。我尝试了
view.getNode
view.getCell
,但仍然没有成功

提前谢谢你

/莱昂内尔

编辑

在进一步挖掘之后,我意识到在调用渲染器时,我的节点实际上还没有准备好,即
视图。getNode
视图。getCell
实际上正在工作,但延迟了(它始终返回null)

解决方法是使用
setTimeout
并在节点就绪后渲染元素。这绝对不是最好的处理方式。欢迎提出任何建议:)


/Lionel

证明了这个问题的答案是使用
setTimeout
来模拟一些延迟,以便在一些延迟之后可以正确添加节点

这是我的
渲染器

renderer = function (v, meta, rec, r, c, store, view) {

    setTimeout(function() {
        var row = view.getNode(rec);

        //Capturing the el (I need the div to do the trick)
        var el = Ext.fly(Ext.fly(row).query('.x-grid-cell')[c]).down('div');

        //All other codes to build the progress bar
    }, 50);
};
很难看,但很管用。如果没有其他答案,我将在未来两天内接受它作为有效答案

干杯


/Lionel

我有一个稍微整洁的解决方案,避免了调用
设置超时

基本上,我的
呈现程序
添加到需要自定义内容的单元格中,然后在页面上显示网格后,我使用
侦听器的组合
将自定义内容呈现到该单元格中

renderer: function (value, metaData, record) {
  metaData.tdCls = metaData.tdCls + ' customContentCell';
  return '';
}
在网格上,我添加了一个
afterrender
监听器,该监听器依次向gridview添加一个
refresh
监听器。我希望使用viewready或其他事件,但在我使用的ext版本4.0.2a中,这似乎不起作用

listeners: {
    afterrender: function (grid) {
        var view = this.getView();
        if (view)
          view.on('refresh', gridRenderCustomContent, this);
    }
}
在该函数中,我循环遍历所有记录,并将内容渲染到单元格中。类似于下面的内容,它只是向单元格中添加了一个ext容器,应该作为基础

var gridRenderCustomContent = function () {

    var recordIdx, colEl, chart, record, ganttHolder;

    for (recordIdx = 0; recordIdx < grid.store.getCount(); recordIdx++) {
        record = grid.store.getAt(recordIdx);
        holder = Ext.DomQuery.select('.customContentCell', grid.view.getNode(recordIdx));
        if (holder.length) {
            colEl = holder[0];
            colEl.innerHTML = '';
            var customContentContainer = new Ext.create('Ext.container.Container', {
                style: 'height: 30px',
                items:[ ... ],
                renderTo: holder
            });
        }
    }
};
var gridrendercutomcontent=函数(){
var recordIdx、colEl、图表、记录、甘特霍尔德;
for(recordIdx=0;recordIdx
我相信有办法解决这个问题。但如果这不是正确的方法,也欢迎任何建议。尝试使用css类的dom查询没有更干净的方法吗?我以为他们会在
视图中的某个地方公开el
我认为这不能在渲染器中完成。你可以这样做插件,我已经做了我的进度栏(画布)在细胞<代码>视图。getNode通过添加延迟工作。当我清理完代码后,我会将我的答案和进度条一起发布/莱昂内尔