Angular.js ng-repeat ในหลาย tr


125

ฉันใช้ Angular.js สำหรับแอปพลิเคชันที่ใช้ trs ที่ซ่อนอยู่เพื่อจำลองเอฟเฟกต์การเลื่อนออกโดยแสดง tr และเลื่อน div ลงมาใน td ด้านล่าง กระบวนการนี้ใช้งานได้อย่างยอดเยี่ยมโดยใช้ knockout.js เมื่อทำซ้ำบนอาร์เรย์ของแถวเหล่านี้เพราะฉันสามารถใช้<!-- ko:foreach -->กับองค์ประกอบ tr ทั้งสองได้

ด้วยเชิงมุมng-repeatต้องใช้กับองค์ประกอบ html ซึ่งหมายความว่าฉันไม่สามารถทำซ้ำแถวคู่เหล่านี้โดยใช้วิธีการมาตรฐานได้ คำตอบแรกของฉันต่อสิ่งนี้คือการสร้างคำสั่งเพื่อแสดงถึง double trs เหล่านี้ แต่มันสั้นเพราะเทมเพลตคำสั่งต้องมีองค์ประกอบรูทเดียว แต่ฉันมีสอง ( <tr></tr><tr></tr>)

หากใครที่มีประสบการณ์เกี่ยวกับ ng-repeat และ angular ที่แตกมันสามารถอธิบายวิธีแก้ปัญหานี้ได้ผมจะขอบคุณมาก

(ฉันควรสังเกตด้วยว่าการติดng-repeatกับ tbody เป็นตัวเลือกหนึ่ง แต่สิ่งนี้ทำให้เกิด tbody หลายตัวและฉันคิดว่านั่นเป็นรูปแบบที่ไม่ดีสำหรับ HTML มาตรฐานแม้ว่าจะแก้ไขฉันถ้าฉันผิด)

คำตอบ:


169

การใช้ng-repeaton tbodyดูเหมือนจะใช้ได้โปรดดูโพสต์นี้

นอกจากนี้การทดสอบอย่างรวดเร็วผ่านเครื่องมือตรวจสอบ HTML ยังอนุญาตให้มีtbodyองค์ประกอบหลายอย่างในตารางเดียวกัน

อัปเดต:อย่างน้อย Angular 1.2 จะมีng-repeat-startและng-repeat-endอนุญาตให้ทำซ้ำชุดขององค์ประกอบได้ ดูเอกสารสำหรับข้อมูลเพิ่มเติมและขอบคุณ @Onite สำหรับความคิดเห็น!


น่าอัศจรรย์ ฉันมีปัญหาเดียวกันและถกเถียงกันในการทำสิ่งนี้ แต่ฉันคิดว่ามันจะไม่ได้ผลเพียงแค่ทำซ้ำบนแท็ก tbody ขอบคุณ!
KhalilRavanna

12
มันเป็นความจริงเล็กน้อยในตอนนี้ แต่ Angular 1.2 ได้แนะนำคำสั่ง ng-repeat-start และ ng-repeat-end เพื่อให้คุณสามารถทำซ้ำหลายองค์ประกอบได้
Onite

1
@Onite ตอนนี้ฉันใช้ AS 1.5 อยู่ แต่ไม่รู้เกี่ยวกับฟังก์ชัน -end และ -start ที่เพิ่มเข้ามาของ ng-repeat คุณชี้ฉันไปที่นั่นดังนั้นอย่าขอโทษที่เพิ่มข้อมูลในคำตอบ
Neville

1
url สำหรับเอกสารประกอบการทำซ้ำผิดพลาด แต่การเปลี่ยนแปลงไม่เกินหกอักขระดังนั้นฉันจึงไม่สามารถแก้ไขได้โดยไม่ต้องเพิ่มการแก้ไขเมตาที่ไร้ประโยชน์ .. URL ที่ถูกต้องควรเป็น docs.angularjs.org/api/ng/ directive / ngRepeat
Bill Rawlinson

35

AngularJS นักพัฒนา @ igor-Minar ตอบนี้Angular.js NG-ซ้ำข้ามหลายองค์ประกอบ

Miško Hevery เพิ่งดำเนินการสนับสนุนที่เหมาะสมผ่านทางng-repeat-startและng-repeat-end. การปรับปรุงนี้ยังไม่ได้รับการเผยแพร่ตั้งแต่ 1.0.7 (เสถียร) และ 1.1.5 (ไม่เสถียร)

ปรับปรุง

ตอนนี้มีให้ใน 1.2.0rc1 ตรวจสอบเอกสารอย่างเป็นทางการและscreencastโดย John Lindquist


เขากล่าวถึงสิ่งนี้ในสตรีมสด Angular Meetup ตั้งแต่วันที่ 11 มิถุนายน 2013 รอคอยสิ่งนี้และคุณสมบัติอื่น ๆ ใน Angular 1.1.5+ และ Angular 2.0
thegreenpizza

ฉันกำลังชี้ไปที่ 1.1.5 บน cdnjs cdn และไม่ได้ผล //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

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.