在dgrid renderRow之后执行一个函数

时间:2013-10-16 18:58:09

标签: javascript dojo dgrid

我正在尝试将一个函数绑定在网格的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

1 个答案:

答案 0 :(得分: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/