21

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

以下是我制作的 Plunker,在此我使用 cellTemplate 插入 Education 字段,但我想根据 Education 字段的详细信息增加行高。

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

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

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

4

6 回答 6

21

这些类将使用 display table-row 和 table-cell 使表格充当实际表格。

.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 {...}
...
于 2013-12-01T15:25:19.147 回答
2

我想插话这个问题。我已经跟进了这个例子,并使用了 getuliojr 提供的解决方案。该解决方案似乎运行良好,请注意,您必须克隆 fork 并构建源代码才能在您的应用程序中使用。我有一个活生生的工作: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

于 2014-04-16T21:02:48.917 回答
2

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

示例是在 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);
}
于 2014-02-13T20:47:48.170 回答
1

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

于 2014-05-12T16:10:24.763 回答
1

适应带。这是小提琴

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

<ad-table-lite table-name="carsForSale"
               column-definition="carsTableColumnDefinition"
               local-data-source="models.carsForSale"
               page-sizes="[7, 20]">
</ad-table-lite>
于 2014-09-06T07:28:20.460 回答
0

这不是世界上最性感的东西,我怀疑它的性能,但这可以解决问题:

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()]
于 2014-12-01T22:03:12.410 回答