我使用Angular.js作为一个应用程序,它使用隐藏的trs来模拟滑出效果,方法是显示tr并向下滑动td中的div。当迭代这些行的数组时,这个过程使用knockout.js非常有效,因为我可以在两个tr元素周围使用<!-- ko:foreach -->
。
对于angular,ng-repeat
必须应用于html元素,这意味着我似乎无法使用标准方法重复这些双行。我对此的第一个回应是创建一个表示这些双trs的指令,但由于指令模板必须有一个根元素,但我有两个(<tr></tr><tr></tr>
)。
如果有任何有ng-repeat和angular经验的人可以解释如何解决这个问题,我将非常感激。
(我还应该注意,将ng-repeat
附加到tbody是一个选项,但这会产生多个tbodys,我认为这是标准HTML的不良形式,尽管如果我错了就纠正我)< / p>
答案 0 :(得分:166)
在ng-repeat
上使用tbody
似乎有效,请参阅this post。
同时通过html validator快速测试允许同一个表格中的多个tbody
元素。
更新:至少在Angular 1.2中,有ng-repeat-start
和ng-repeat-end
允许重复一系列元素。有关详细信息,请参阅the documentation,感谢@Onite的评论!
答案 1 :(得分:35)
AngularJS开发人员@ igor-minar在Angular.js ng-repeat across multiple elements中回答了这个问题。
MiškoHevery最近通过ng-repeat-start
和ng-repeat-end
实施了适当的支持。从1.0.7(稳定)和1.1.5(不稳定)开始,此增强功能尚未发布。
现在可以在1.2.0rc1中使用。查看John Lindquist的official docs和this screencast。
答案 2 :(得分:4)
拥有多个元素可能有效但如果您尝试构建具有固定页眉/页脚的可滚动网格,则后续操作无效。此代码假定以下CSS,jquery和AngularJS。
HTML
<table id="tablegrid_ko">
<thead>
<tr>
<th>
Product Title
</th>
<th>
</th>
</tr>
</thead>
<tbody ng-repeat="item in itemList">
<tr ng-repeat="itemUnit in item.itemUnit">
<td>{{itemUnit.Name}}</td>
</tr>
</tbody>
</table>
CSS为可滚动表格构建固定页眉/页脚
#tablegrid_ko {
max-height: 450px;
}
#tablegrid_ko
{
border-width: 0 0 1px 1px;
border-spacing: 0;
border-collapse: collapse;
border-style: solid;
}
#tablegrid_ko td, #tablegrid_ko th
{
margin: 0;
padding: 4px;
border-width: 1px 1px 0 0;
border-style: solid;
}
#tablegrid_ko{border-collapse:separate}
#tablegrid_ko tfoot,#tablegrid_ko thead{z-index:1}
#tablegrid_ko tbody{z-index:0}
#tablegrid_ko tr{height:20px}
#tablegrid_ko tr >td,#tablegrid_ko tr >th{
border-width:1px;border-style:outset;height:20px;
max-height:20px;xwidth:45px;xmin-width:45px;xmax-width:45px;white-space:nowrap;overflow:hidden;padding:3px}
#tablegrid_ko tr >th{
background-color:#999;border-color:#2c85b1 #18475f #18475f #2c85b1;color:#fff;font-weight:bold}
#tablegrid_ko tr >td{background-color:#fff}
#tablegrid_ko tr:nth-child(odd)>td{background-color:#f3f3f3;border-color:#fff #e6e6e6 #e6e6e6 #fff}
#tablegrid_ko tr:nth-child(even)>td{background-color:#ddd;border-color:#eaeaea #d0d0d0 #d0d0d0 #eaeaea}
div.scrollable-table-wrapper{
background:#268;border:1px solid #268;
display:inline-block;height:285px;min-height:285px;
max-height:285px;width:550px;position:relative;overflow:hidden;padding:26px 0}
div.scrollable-table-wrapper table{position:static}
div.scrollable-table-wrapper tfoot,div.scrollable-table-wrapper thead{position:absolute}
div.scrollable-table-wrapper thead{left:0;top:0}
div.scrollable-table-wrapper tfoot{left:0;bottom:0}
div.scrollable-table-wrapper tbody{display:block;position:relative;overflow-y:scroll;height:283px;width:550px}
Jquery绑定tbody的水平滚动,这不起作用,因为tbody在ng-repeat期间重复。
$(function ($) {
$.fn.tablegrid = function () {
var $table = $(this);
var $thead = $table.find('thead');
var $tbody = $table.find('tbody');
var $tfoot = $table.find('tfoot');
$table.wrap("<div class='scrollable-table-wrapper'></div>");
$tbody.bind('scroll', function (ev) {
var $css = { 'left': -ev.target.scrollLeft };
$thead.css($css);
//$tfoot.css($css);
});
}; // plugin function
}(jQuery));
答案 3 :(得分:0)
你可以这样做,正如我在这个答案中所表明的那样:https://stackoverflow.com/a/26420732/769900
<tr ng-repeat="m in myData">
<td>{{m.Name}}</td>
<td>{{m.LastName}}</td>
<td ng-if="$first" rowspan="{{myData.length}}">
<ul>
<li ng-repeat="d in days">
{{d.hours}}
</li>
</ul>
</td>
</tr>