在render()方法完成后执行操作

时间:2011-06-03 08:19:48

标签: slickgrid

render()方法完成其工作并将所有HTML元素附加到DOM时,我需要执行一些操作。 如何订阅onRenderEnds事件(没有此类事件)? 我可以在slickgrid代码之外编写自己的事件并将其附加到render()方法吗?


有一些事件"onScroll", "onViewportChanged",但它们发生在render()完成之前(在某些情况下)。


更新: 我为列编写格式化程序:

formatter: function(row, cell, value, columnDef, dataContext){
    return "<div class='operationList' data-my='" + myData + "'></div>";            
}

当网格渲染(应用我的格式化程序)时,我需要遍历所有".operationList" divs并将它们转换为其他构造(基于data-my属性)。我需要将".operationList" divs替换为具有事件处理程序的复杂结构。

2 个答案:

答案 0 :(得分:8)

要回答我自己的评论,我想出了以下 hack 。它可能不是很漂亮但似乎有用。

将以下行添加到render()

下方的renderRows(rendered);方法中
function render() {
    ...
    renderRows(rendered);
    trigger(self.onRenderCompleted, {}); // fire when rendering is done
    ...
}

向公共API添加新的事件处理程序:

"onRenderCompleted":            new Slick.Event(),

绑定到代码中的新事件:

grid.onRenderCompleted.subscribe(function() {
    console.log('onRenderCompleted');
});

答案 1 :(得分:4)

基本答案是不要! 你提出的是一个非常糟糕的设计,违背了SlickGrid的核心原则和架构。

您将最终完成大量冗余工作并否定SlickGrid的大部分性能优势。当您滚动时,网格将动态创建和删除行DOM节点,并根据当时最适合的方式同步或异步地执行。如果单元格中必须包含丰富的交互式内容,请使用自定义单元格渲染器,并使用其提供的事件(如onClick)将所有事件处理委派给网格级别。如果使用渲染器无法创建单元格的内容,请使用异步后渲染 - http://mleibman.github.com/SlickGrid/examples/example10-async-post-render.html。即便如此,网格内容也不应该有任何直接向DOM节点注册的事件监听器。

要解决@ magiconair的评论,在单元格切换到编辑模式之前,你真的不应该用它的所有选项和事件处理程序渲染一个完整的SELECT。