0

我试图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!

删除了一些数据的网格图像

4

1 回答 1

3

您可以推迟调用 ,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/

于 2013-10-18T00:49:26.223 回答