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指令的解析逻辑都有关系:
- HTML表格的DOM约束:浏览器对表格结构有严格要求,
<tr>的直接子元素只能是<td>、<th>这类表格专用元素。ng-container是Angular提供的「逻辑容器」,它不会被渲染成真实DOM节点,浏览器解析表格时会忽略不符合结构的内容,间接导致Angular的ng-repeat指令没法在这个位置正确绑定作用域。 - 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-start和ng-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位置解析作用域,上面的方案你可以根据自己的实际业务场景来选,应该都能解决你的问题~




