跨多个tr的Angular.js ng-repeat


125

我将Angular.js用于通过隐藏trs通过显示tr并在下面的td中将div向下滑动来模拟滑出效果的应用程序。当遍历这些行的数组时,此过程可以使用kickout.js出色地工作,因为我可以<!-- ko:foreach -->在两个tr元素之间使用。

使用angular时,ng-repeat必须将其应用于html元素,这意味着我似乎无法使用标准方法来重复这些双行。我对此的第一个响应是创建一个表示这些double tr的指令,但是由于指令模板必须具有一个根元素,而我却有两个(<tr></tr><tr></tr>),所以未能达到要求。

如果任何具有ng-repeat和angular经验的人都可以解决这个问题,那么我将不胜感激。

(我还应该注意,附加ng-repeat到tbody是一个选项,但这会产生多个tbody,并且我认为这对于标准HTML来说是不好的形式,尽管如果我错了也可以纠正我)

Answers:


168

使用ng-repeaton tbody似乎有效,请参阅这篇文章

此外,通过html验证程序进行的快速测试还允许tbody在同一张表中包含多个元素。

更新:从Angular 1.2起,至少有一个ng-repeat-startng-repeat-end允许重复一系列元素。有关更多信息,请参见文档,并感谢@Onite的评论!


太棒了 我遇到了同样的问题,实际上对此进行了辩论,但我认为仅在tbody标签上进行迭代就永远不会起作用。谢谢!
KhalilRavanna 2013年

11
现在已经有些不对了,但是Angular 1.2引入了ng-repeat-start和ng-repeat-end指令,以允许您迭代多个元素。
Onite

1
@Onite现在晚了很多,我正在使用AS 1.5,但不知道ng-repeat的-end和-start功能。您指出了我的存在,因此不要为在答案中添加信息而道歉。
内维尔

1
ng重复文档的url是错误的,但所做
Bill Rawlinson,

35

AngularJS开发人员@ igor-minar在Angular.js ng-repeat中跨多个元素回答了这一问题。

MiškoHevery最近通过ng-repeat-start和实施了适当的支持ng-repeat-end。从1.0.7(稳定)和1.1.5(不稳定)开始,尚未发布此增强功能。

更新资料

现在在1.2.0rc1中可用。查看官方文档以及John Lindquist的截屏视频


他在2013年6月11日的Angular聚会直播中提到了这一点。期待Angular 1.1.5+和Angular 2.0中的此功能以及其他功能。
thegreenpizza 2013年

我指的是cdnjs cdn上的1.1.5,这是行不通的。//cdnjs.cloudflare.com/ajax/libs/angular.js/1.1.5/angular.min.js您知道应该使用哪个版本吗?
Shanimal

正确,从1.1.5版开始尚未发布,因此请注意1.1.6(或很有可能是1.2.0)即将登陆。这是Miško致力于发布的承诺:github.com/angular/angular.js/commit/…–
Anson

还要注意,这不仅适用于ngRepeat,而且适用于每个指令;)
7hi4g0 2013年

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));

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>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.