【问题标题】:Executing a function after the dgrid renderRow在 dgrid renderRow 之后执行一个函数
【发布时间】:2013-10-16 18:58:09
【问题描述】:

我正在尝试在网格的renderRow 事件之后绑定要执行的函数。所以我使用了 DOJO 的 aspect.after,但这里是关键。这在该行确实被渲染之前执行,因此 divs\tds 还没有出现在屏幕上。因为我确实想使用项目的位置,所以使用 dojo/domgeometry 返回一个用零填充的对象。如何保证我的函数将在行显示完成后执行?

你可以在下面找到我调用它的 JS。

    aspect.after(grid, 'renderRow', function(row, args) {
        var object = args[0];
        if (object.type == 'tipo_exec') {
            row.className += ' black';
        } else if(object.type == 'exec') {
            row.className += ' gray';
        } else if(object.type == 'ic') {
            if ((typeof(object.dep)!='undefined') && (object.dep.length > 0)) {
                require(['dojo/dom-geometry','dojo/dom-construct'],
                    function(domGeom, domConstruct){
                        console.log(domGeom.position(row));
                    }
                );
            }
        }
        return row;
    });

编辑:另一件事,我正在使用树扩展,并且 renderRow 在单击父级展开后发生。

编辑:所以这里有更多信息,以备不时之需。店铺很简单:

    store = new Observable(new Memory({'data': data,
        'getChildren': function(parent, options){
            return this.query({'parent': parent.id}, options);
        },
        'mayHaveChildren': function(parent){
            return parent.hasChildren;
        }
    }));

并且网格声明为:

grid = new (declare([OnDemandGrid, Selection, Keyboard, CompoundColumns]))({
        'columns': nCols,
        'query': { 'parent': undefined },
        'store': store

    }, gridId);

这是之后方面的内部

if ((typeof(object.dep)!='undefined') && (object.dep.length > 0)) {
    console.log('just before adding the refresh');
        on.once(this, 'dgrid-refresh-complete', function(){
            console.log('finished refreshing');
            require(['dojo/dom-geometry','dojo/dom-construct'],
                function(domGeom, domConstruct){
                    console.log(domGeom.position(node));
                }
            );
        });
}

console.log('finished refreshing');永远不会被调用,位置日志也不会。

网格上有许多列,一对列在一个复合列上,一个名称列是一棵树,还有一些其他列。展开树时调用 renderRow!

Image of the grid with a couple of data removed

【问题讨论】:

  • @ahmed 非常糟糕的主意。
  • setTimeout 在一条评论中被建议,该评论已被删除。
  • 是的,但问题是我认为我将不得不求助于它。使用自动刷新的超时,直到该位置返回非零数据。它很笨重,但总比没有好

标签: javascript dojo dgrid


【解决方案1】:

您可以推迟domGeom.position(row) 的调用,直到发出dgrid-refresh-complete 事件。您需要包含 dojo/on。

aspect.after(grid, 'renderRow', function(row, args) {
    var object = args[0];
    if (object.type == 'tipo_exec') {
        row.className += ' black';
    } else if(object.type == 'exec') {
        row.className += ' gray';
    } else if(object.type == 'ic') {
        if ((typeof(object.dep)!='undefined') && (object.dep.length > 0)) {
            on.once(this, 'dgrid-refresh-complete', function(){
                require(['dojo/dom-geometry','dojo/dom-construct'],
                    function(domGeom, domConstruct){
                        console.log(domGeom.position(row));
                    }
                );
            })
        }
    }
    return row;
});

编辑 更新了 jsfiddle 以适应树 http://jsfiddle.net/rayotte/q8bCx/2/

【讨论】:

  • Sweet,去试一试,结果会在这里发布
  • 不幸的是它不起作用。我尝试将dgrid-refresh-complete 事件连接到网格和grid.domNode(因为它在onDemandList.js 上被调用),但两个选项都没有被触发。如果有任何区别,这就是网格的声明。 declare([OnDemandGrid, Selection, Keyboard, CompoundColumns])
  • 代码已经过测试并且可以工作。可能不满足if ((typeof(object.dep)!='undefined') && (object.dep.length > 0)) 中的条件之一。
  • 没有。我在 on.once 行之前放了一个日志,它被触发了。 domGeom 控制台没有。您是否使用其中一列上的树扩展对其进行了\测试?
  • 我没有使用树插件,但在我尝试之前,您使用的是哪个版本的 dgrid 和 Dojo?我问是因为dgrid-refresh-complete 事件是在更高版本中添加的。我目前在 dgrid 0.3.11 和 Dojo 1.9.1
猜你喜欢
  • 2011-12-04
  • 1970-01-01
  • 2015-08-02
  • 1970-01-01
  • 2016-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-24
相关资源
最近更新 更多