You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

ng-container在HTML表格内配合ng-repeat使用失效的问题求助

ng-container在HTML表格内配合ng-repeat使用失效的问题求助

问题描述

大家好,我最近在做AngularJS项目时碰到个头疼的问题:在HTML表格的<tr>里用<ng-container>配合ng-repeat循环数据,结果循环变量ca一直显示undefined,完全用不了,但只要把<ng-container>换成<td>元素,代码立刻就正常了,这到底是哪里出问题了?

我写的代码是这样的:

<tbody>
  <tr>
    <ng-container style="border-bottom: 5px solid black" ng-repeat="ca in cas">
      <td ng-click="test(ca)">works {{ca.property}}</td>
    </ng-container>
  </tr>
</tbody>

具体现象就是:用ng-container时,{{ca.property}}压根显示不出来,点击td调用test(ca)也传不了正确的值;换成<td>之后,不仅ca.property能正常渲染,点击事件也能正确把ca传进去,完全没毛病。

原因分析

其实这个问题和HTML表格的结构规则、AngularJS指令的解析逻辑都有关系:

  1. HTML表格的DOM约束:浏览器对表格结构有严格要求,<tr>的直接子元素只能是<td><th>这类表格专用元素。ng-container是Angular提供的「逻辑容器」,它不会被渲染成真实DOM节点,浏览器解析表格时会忽略不符合结构的内容,间接导致Angular的ng-repeat指令没法在这个位置正确绑定作用域。
  2. AngularJS作用域绑定问题ng-repeat在非表格标准元素上执行时,循环产生的作用域没法正确传递到内部的<td>元素,所以你在td里访问ca时,这个变量根本不在当前作用域里。

解决方案

根据你的实际需求,这里有几个可行的解决办法:

方案1:把ng-repeat移到上(每个循环项对应一行的场景)

如果你的需求是每个ca数据对应表格的一行,那直接把ng-repeat加到<tr>上最直接:

<tbody>
  <tr style="border-bottom: 5px solid black" ng-repeat="ca in cas">
    <td ng-click="test(ca)">works {{ca.property}}</td>
  </tr>
</tbody>

方案2:把ng-repeat直接加到上(一行里循环多个单元格的场景)

如果是要在同一行里循环生成多个<td>单元格,那直接把ng-repeat放到<td>元素上就行:

<tbody>
  <tr>
    <td style="border-bottom: 5px solid black" ng-repeat="ca in cas" ng-click="test(ca)">
      works {{ca.property}}
    </td>
  </tr>
</tbody>

方案3:用ng-repeat-start/ng-repeat-end替代ng-container(需保留逻辑容器的复杂场景)

如果你的场景比较复杂,必须用逻辑容器包裹多个元素循环,那可以用AngularJS的ng-repeat-startng-repeat-end指令,它们不需要依赖具体的容器元素,能在表格里正常工作:

<tbody>
  <tr>
    <ng-container ng-repeat-start="ca in cas">
      <td style="border-bottom: 5px solid black" ng-click="test(ca)">works {{ca.property}}</td>
    </ng-container>
    <ng-container ng-repeat-end></ng-container>
  </tr>
</tbody>

总结

核心就是要遵守HTML表格的结构规范,同时让AngularJS的指令能在正确的DOM位置解析作用域,上面的方案你可以根据自己的实际业务场景来选,应该都能解决你的问题~

火山引擎 最新活动