角度 ng-grid 行高

Posted

技术标签:

【中文标题】角度 ng-grid 行高【英文标题】:Angular ng-grid row height 【发布时间】:2013-10-06 08:18:15 【问题描述】:

有没有办法根据其内容在 ng-grid 中应用行的高度。 有一个选项 rowHeight 可以更改所有行的高度。但我想要根据其内容动态行高。

以下是我做的Plunker,这里我用cellTemplate插入教育字段,但是我想根据教育字段的细节增加行高。

http://plnkr.co/edit/tQJNpB?p=preview

根据此链接,这是不可能的: [1]https://github.com/angular-ui/ng-grid/issues/157

但是如果有人找到解决方案.....

【问题讨论】:

【参考方案1】:

这些类将使表格充当实际表格,使用显示表格行和表格单元格。

.ngCell  
  display : table-cell;
  height: auto !important;
  overflow:visible;
  position: static;


.ngRow 
  display : table-row;
  height: auto !important;
  position: static;


.ngCellText
  height: auto !important;
  white-space: normal;
  overflow:visible;

请注意,IE8 及更高版本支持此功能。它还覆盖了整个 ng 网格类,因此在“需要”基础上使用是明智的:

#myTableId .ngCell ...
#myTableId .ngRow ...
...

【讨论】:

在将这些样式与 virtualizationThreshold 选项一起使用时要小心 - 当超过它时,视口开始表现异常 感谢 Yair,所以你在那里学习了 angular.js :) 如何根据其内容使整个 ng-grid 高度动态化? Dejel - 将 ngViewport 类设置为 height:auto 和 overflow:visible; 除了行虚拟化和动态网格高度插件之外,还有什么会破坏的吗?如果一个人可以没有这些,这可以用吗? 玩了一会儿之后,图表的内部高度和宽度似乎有点偏离,并且固定似乎无法正常工作。【参考方案2】:

对此进行研究发现,在我的修复中,每当它更改 ngGrid 数据时都应该调用匿名函数 $scope.resizeViewPort,或者应该在更新视口行时调用它。

示例是在 Angular 通过来自 ng-grid 模块的数据对行执行更新之后。我发现这些步骤在我的匿名函数中仅用于高度:

$scope.resizeViewPort = function  // and the two steps below
  // retrieve viewPortHeight
  var viewportHeight = $('ngViewPort').height();
  var gridHeight = $('ngGrid').height();

  // set the .ngGridStyle or the first parent of my ngViewPort in current scope
  var viewportHeight = $('.ngViewport').height();
  var canvasHeight = $('.ngCanvas').height();
  var gridHeight = $('.ngGrid').height();

  alert("vp:" + viewportHeight + " cv:" + canvasHeight + " gh:" + gridHeight);
  var finalHeight = canvasHeight;
  var minHeight = 150;
  var maxHeight = 300;


  // if the grid height less than 150 set to 150, same for > 300 set to 300
  if (finalHeight < minHeight) 
    finalHeight = minHeight;
   else if (finalHeight > viewportHeight) 
    finalHeight = maxHeight;
  

  $(".ngViewport").height(finalHeight);

【讨论】:

这只适用于一个网格。需要弄清楚如何获取当前网格的范围,然后进行此视口更改。【参考方案3】:

我想就这个问题发表意见。我已经跟进了这个例子,并使用了 getuliojr 提供的解决方案。该解决方案似乎运行良好,请注意,您必须克隆 fork 并构建源代码才能在您的应用程序中使用。我有一个 plunker live 的工作:http://plnkr.co/edit/nhujNRyhET4NT04Mv6Mo?p=preview

请注意,您还需要添加 2 个 css 规则:

.ngCellText
    white-space:normal !important;
    

.ngVerticalBarVisible
      height: 100% !important;
    

我还没有在高负载或跨浏览器的情况下对此进行测试,但一旦我这样做了就会更新更多。

getuliojr 为 ng-grid 提供灵活高度的 GH 回购:https://github.com/getuliojr/ng-grid/commits/master

【讨论】:

【参考方案4】:

这些解决方案都不能完全发挥作用。在整个代码中都假定高度是固定的。行虚拟化通常会假设这一点,因为您不会一次加载所有行,因此很难判断网格的最终高度。 NGrid 3.0 应该支持动态行高,但我不确定它什么时候准备好。

【讨论】:

【参考方案5】:

Adapt-Strap。这是fiddle。

它非常轻巧,并且具有动态的行高。

<ad-table-lite table-name="carsForSale"
               column-definition="carsTableColumnDefinition"
               local-data-source="models.carsForSale"
               page-sizes="[7, 20]">
</ad-table-lite>

【讨论】:

【参考方案6】:

它不是世界上最性感的东西,我怀疑它的性能,但这确实有效:

function flexRowHeight() 
    var self = this;
    self.grid = null;
    self.scope = null;
    self.init = function (scope, grid, services) 
        self.domUtilityService = services.DomUtilityService;
        self.grid = grid;
        self.scope = scope;

        var adjust = function() 
            setTimeout(function()
                var row = $(self.grid.$canvas).find('.ngRow'),
                    offs;
                row.each(function()
                    var mh = 0,
                        s = angular.element(this).scope();

                    $(this).find('> div').each(function()
                        var h = $(this)[0].scrollHeight;
                        if(h > mh)
                            mh = h

                        $(this).css('height','100%');
                    );

                    $(this).height(mh)

                    if(offs)
                        $(this).css('top',offs + 'px');

                    offs = $(this).position().top + mh;
                    self.scope.$apply(function()
                        s.rowHeight = mh;
                    );
                );
            ,1);
        

        self.scope.$watch(self.grid.config.data, adjust, true);
    

使用选项中的插件执行:

plugins: [new flexRowHeight()]

【讨论】:

以上是关于角度 ng-grid 行高的主要内容,如果未能解决你的问题,请参考以下文章

ng-grid 展开和折叠行

DataGrid 行内容垂直对齐

关于htcs边区扫盲(行块优先显示符号补充)

angular.js学习-ng-grid

通过自定义指令进行 ng-grid 分页

javascript 等高行javascript