当排序更改时,dojo datagrid将使页面“跳转”

时间:2010-03-19 10:57:17

标签: sorting datagrid dojo

我的一个页面中有一个Dojo Datagrid(包含更多内容),并出现以下问题:只要我点击一个列标题来更改排序,页面就会跳起来,就好像我点击了一些HTML锚

有趣的是,页面跳转会使网格在跳转后仅显示前两行,而不是(例如)跳转后网格顶部的网格开始,这是锚点的预期行为使用。

问题出现在不同的浏览器中(测试过:Firefox 3.6,Opera 10,IE6),所以我猜它可能是一个Dojo问题/ -bug。

任何让这种烦人行为停止的想法都停止了吗?

问候, Select0r

PS:this似乎描述了类似的问题,仅针对JQuery(不幸的是,没有解决方案)

2 个答案:

答案 0 :(得分:4)

在DataGrid和底层的_Grid中有一些力可以使网格缩小到读取之间的标题行的高度,然后重新增长。如果您在滚动到页面底部时遇到了专门描述的行为,那么您的浏览器可能会“向上滚动”(以便其视口的底部与页面的新底部对齐),但是当表格时加载新数据并再次调整大小,您的浏览器仍然“向上滚动”。

我花了一些时间在DataGrid和_Grid周围挖掘。我发现这有两个原因:

  1. DataGrid的_clearData函数,它调用updateRowCount(0)(即将网格减少到0行,直到新结果出现)

  2. _Grid的_resize函数,如果_autoHeight为true,则将其viewsNode的高度样式设置为''(如果autoHeight为true,或者是一个数字> = rowCount,则似乎是这种情况)

    < / LI>

    如果你不反对搞乱源代码,你可以简单地从DataGrid._clearData中删除一行代码,从_Grid._resize中删除另一行代码并完成它;假设你想要一个更干净的方法,我试图用几个变通方法继承DataGrid。看看你的票价。

    dojo.provide('my.DataGrid');
    
    dojo.declare('my.DataGrid', dojox.grid.DataGrid, {
      updateRowCount: function(inRowCount) {
        if (inRowCount > 0) { //ignore requests to set rowCount to 0
          this.inherited(arguments);
        }
      },
      _resize: function(changeSize, resultSize) {
        if (this._autoHeight) {
          //sizeblink workaround
          var _viewsNode = this.viewsNode;
          this.viewsNode = {style: {height: ''}}; //_Grid._resize crash dummy
          this.inherited(arguments);
          this.viewsNode = _viewsNode;
          //call post-functions again with node properly hooked
          this.adaptWidth();
          this.adaptHeight();
          this.postresize();
        } else {
          this.inherited(arguments);
        }
      }
    });
    //carry over DataGrid's custom markupFactory, otherwise declarative won't work
    my.DataGrid.markupFactory = dojox.grid.DataGrid.markupFactory;
    

    希望它有所帮助,或者至少提供洞察力。我想知道这个问题是否应该作为dojo的trac中的错误输入...

答案 1 :(得分:0)

这是一个快速而又肮脏的解决方法:在评估CnEY时,问题是DataGrid将自身重置为0行,然后再次使用数据填充自己。

如果使用具有网格高度最小高度的DIV封装DataGrid,则重置不会影响页面的高度,因此“跳转”将停止。

当然,这只是一个基本的解决方法,因为即使用JavaScript设置/更改了周围DIV的高度也有些静态,所以我宁愿选择动态的东西(作为CnEY发布的解决方案)。