角度固定表头故障

Posted

技术标签:

【中文标题】角度固定表头故障【英文标题】:Angular Fixed Table Header Glitch 【发布时间】:2016-08-11 19:53:10 【问题描述】:

这是我之前的帖子found here 的延续。

固定标题工作正常,但我在初始加载时遇到问题。 当表第一次加载时,它看起来像这样:

但是,一旦我单击列标题以按该值对其进行排序,所有内容都会卡入到位并最终看起来像这样:

就像我在上一篇文章中所说,我正在使用anguFixedHeaderTable 插件。标题很好,但我只是遇到了这个故障。如果这有助于调试问题,我可以提供我在这个项目中使用的所有资源的详细信息。我可以提供更多信息,但我现在不知道该提供什么。

另外,当我单击列对列表进行排序时,表格会闪烁,因为它会扩展为完整大小,然后返回到 300 像素的高度并带有滚动条。如果我再点击几次,它会排序而不会出现任何表格闪烁。如果我单击一个新的列标题进行排序,它会再次闪烁一次,但再单击几次相同的标题会产生平滑和干净的排序。知道是什么导致了这种闪烁吗?

编辑 1: 根据 Code Wizard 的建议,我从演示中获取了工作代码并将其放入 github .js 文件中。这是我现在拥有的:

function tableDataLoaded() 
    // first cell in the tbody exists when data is loaded but doesn't have a width
    // until after the table is transformed
    return $elem.find("tbody").is(':visible');
    /*var firstCell = elem.querySelector('tbody tr:first-child td:first-child');
    return firstCell && !firstCell.style.width;*/

这实际上在第一次加载时完美运行。唯一的问题是我有两个表,用户可以通过单击按钮在它们之间切换。这些表由一个简单的ng-show 表达式控制,以检测用户选择的视图。因此,当表格首次加载时,它们在两个视图中的外观都应如此。但是,如果您继续来回切换,列又会开始混乱。在您单击该列对其进行排序之前,它会迅速恢复原位。

编辑 2: 我尝试使用 css 路线,并且大部分时间都可以正常工作。唯一的问题是列稍微错位。主要问题是列宽不是动态的。 Here's a plunker 重现我的问题。如您所见,第一行的第一列内容溢出到相邻列中。我希望列是动态且对齐的

【问题讨论】:

你的方向不对;尝试为我们提供一些 code 而不是赏金。 你能解释一下tbodyflex: 1 1 auto;的原因吗? 作为对编辑 2 的评论:移位是因为滚动条占用了 tbody 中的空间,导致 flex 的空间更小 编辑 2:***.com/a/17380697/976596 看起来您从根本上破坏了整个表格流程。首先,您将<tr> 用作table。什么是排行? display: table-row; 有助于 display: table-cell; 元素根据需要实际增加宽度。如果没有正确设置 display: table-row; 的父元素,单元格将无法以这种方式运行。 【参考方案1】:

尝试添加这个 CSS:

.table 
  width: 100%;
  height: 200px;

请查看此修改后的 CodePen:CodePen for fixed Header & Footer

【讨论】:

这是另一个使用 angularJs 进行绑定和 css 进行样式设置的固定页眉和页脚表。我没有使用 AngularJS 的固定头滚动表指令。但它会解决问题,我敢肯定。 CodePan for Table 这是代码不是“CodePan”:p【参考方案2】:

您的问题已基本解决,我认为您只需要应用 CSS 的修复即可完成它。我们如何包装第一列:

table tr th:first-child, table tr td:first-child
  word-wrap: break-word;
  white-space: inherit!important;

Preview on Plunker

您表中的 TD 已经响应,我们只需要修改以通过在您可能认为会发生的每个 th, td 中应用换行来使内容不会溢出。

上面的代码我把它应用到了第一个孩子,但是你可以自定义整个表格。

【讨论】:

【参考方案3】:

您是否尝试在 table 和 tr 中添加 width:100%;

table,tr 
    width:100%;

Demo here

【讨论】:

【参考方案4】:

由于我没有您的代码,我只能通过指出可能导致此问题的一些问题来帮助您。

html 引擎渲染表格时,它必须遍历所有单元格并计算每个单元格的最大宽度,以便找到每个表格列的最大宽度。

anguFixedHeaderTable 使用此代码:

function tableDataLoaded() 
    // first cell in the tbody exists when data is loaded but doesn't have a width
    // until after the table is transformed
    var firstCell = elem.querySelector('tbody tr:first-child td:first-child');
    return firstCell && !firstCell.style.width;
    

这个函数在这里被触发:

// wait for data to load and then transform the table
$scope.$watch(tableDataLoaded, function(isTableDataLoaded) 
    if (isTableDataLoaded) 
        transformTable();
        
    );

如果执行此代码时表格尚未加载,表格将“固定”其宽度,并将使用 HTML 引擎为其设置的默认宽度。

为了修复它我建议做的是加载表并且只有 After 加载它(以确保在加载表后调用该函数)是使用 java 脚本代码会将指令附加到表中以重写此模块以解决此问题。


在使用代码并尝试解决问题后更新。

Note

演示站点上的代码与 GitHub 中的代码不同

演示代码: - http://pointblankdevelopment.com.au/plnks/angularjs-fixed-header-scrollable-table-directive/app.js

GitHub 代码 - https://github.com/cornflourblue/angu-fixed-header-table/blob/master/angu-fixed-header-table.js

不同的是:

 # The working code in the demo
 $scope.$watch(function ()  return $elem.find("tbody").is(':visible') ,


# The "buggy" code on git hub
// wait for data to load and then transform the table
$scope.$watch(tableDataLoaded, 
    function(isTableDataLoaded) 
        if (isTableDataLoaded) 
            transformTable();
        
    
);

从演示中获取代码,它将按预期工作。

祝你好运。

【讨论】:

能否请您发布一个演示代码。所以我可以帮助你。 我决定让事情变得简单,走 css 路线。不过仍然有问题,我编辑了我的帖子以显示演示。关于可能的解决方案的任何想法?

以上是关于角度固定表头故障的主要内容,如果未能解决你的问题,请参考以下文章

excel表格怎样锁定表头前两行(怎样固定excel表头前两行)

如何固定table的表头

css写一个表头如何固定

很急GridView固定表头和指定列

自定义Table固定列和表头

bootstrap table 可以固定表头吗