KnockoutJS containerless binding syntax
โปรดอดทนกับฉันสักครู่: KnockoutJS เสนอตัวเลือกที่สะดวกเป็นพิเศษในการใช้ไวยากรณ์การผูกแบบไม่ใช้คอนเทนเนอร์สำหรับการforeach
ผูกตามที่กล่าวไว้ในหมายเหตุ 4 ของforeach
เอกสารการผูก
http://knockoutjs.com/documentation/foreach-binding.html
ดังตัวอย่างเอกสาร Knockout คุณสามารถเขียนการผูกของคุณใน KnockoutJS ดังนี้:
<ul>
<li class="header">Header item</li>
<!-- ko foreach: myItems -->
<li>Item <span data-bind="text: $data"></span></li>
<!-- /ko -->
</ul>
ฉันคิดว่ามันค่อนข้างโชคร้ายที่ AngularJS ไม่มีไวยากรณ์ประเภทนี้
Angular ng-repeat-start
และng-repeat-end
ในวิธี AngularJS ในการแก้ng-repeat
ปัญหาตัวอย่างที่ฉันเจอเป็นประเภท jmagnusson ที่โพสต์ไว้ในคำตอบ (เป็นประโยชน์) ของเขา
<li ng-repeat-start="page in [1,2,3,4,5]"><a href="#">{{page}}</a></li>
<li ng-repeat-end></li>
ความคิดเดิมของฉันเมื่อเห็นไวยากรณ์นี้คือจริงเหรอ? เหตุใด Angular จึงบังคับให้มาร์กอัปพิเศษทั้งหมดนี้ซึ่งฉันไม่ต้องการทำอะไรเลยและมันง่ายกว่ามากใน Knockout แต่แล้วความคิดเห็นของ hitautodestruct ในคำตอบของ jmagnusson เริ่มทำให้ฉันสงสัย: สิ่งที่สร้างขึ้นด้วย ng-repeat-start และ ng-repeat-end ในแท็กแยกกัน?
วิธีที่สะอาดกว่าในการใช้งานng-repeat-start
และng-repeat-end
จากการตรวจสอบการยืนยันของ hitautodestruct การเพิ่มng-repeat-end
ลงในแท็กแยกต่างหากเป็นสิ่งที่ฉันไม่ต้องการทำในกรณีส่วนใหญ่เพราะมันสร้างองค์ประกอบที่ไร้ประโยชน์อย่างเต็มที่ในกรณีนี้<li>
รายการที่ไม่มีอะไรอยู่ในนั้น รายการที่มีการแบ่งหน้าของ Bootstrap 3 จะจัดรูปแบบรายการเพื่อให้ดูเหมือนว่าคุณไม่ได้สร้างรายการที่ไม่จำเป็น แต่เมื่อคุณตรวจสอบ html ที่สร้างขึ้นพวกเขาจะอยู่ที่นั่น
โชคดีที่คุณไม่จำเป็นต้องทำอะไรมากเพื่อให้มีโซลูชันที่สะอาดกว่าและ html ในปริมาณที่สั้นลง: เพียงแค่วางng-repeat-end
คำประกาศไว้บนแท็ก html เดียวกับที่มีng-repeat-start
.
<ul class="pagination">
<li>
<a href="#">«</a>
</li>
<li ng-repeat-start="page in [1,2,3,4,5]" ng-repeat-end><a href="#"></a></li>
<li>
<a href="#">»</a>
</li>
</ul>
สิ่งนี้ให้ข้อดี 3 ประการ:
- แท็ก html น้อยที่จะเขียน
- Angular ไม่ได้สร้างแท็กว่างเปล่าที่ไร้ประโยชน์
- เมื่ออาร์เรย์ที่จะทำซ้ำว่างเปล่าแท็กที่มี
ng-repeat
จะไม่ถูกสร้างขึ้นทำให้คุณได้รับข้อได้เปรียบเดียวกันกับการผูกแบบไม่ใช้คอนเทนเนอร์ของ Knockout ให้คุณในเรื่องนี้
แต่ยังมีวิธีที่สะอาดกว่า
หลังจากการตรวจสอบต่อไปความคิดเห็นใน GitHub ในเรื่องนี้สำหรับเชิงมุมhttps://github.com/angular/angular.js/issues/1891 ,
คุณไม่จำเป็นต้องใช้งานng-repeat-start
และng-repeat-end
เพื่อให้บรรลุข้อได้เปรียบเดียวกัน แทนที่จะยกตัวอย่างของ jmagnusson อีกครั้งเราสามารถไป:
<ul class="pagination">
<li>
<a href="#">«</a>
</li>
<li ng-repeat="page in [1,2,3,4,5,6]"><a href="#">{{page}}</a></li>
<li>
<a href="#">»</a>
</li>
</ul>
ดังนั้นควรใช้เมื่อใดng-repeat-start
และng-repeat-end
? ตามเอกสารเชิงมุมถึง
... ทำซ้ำชุดขององค์ประกอบแทนที่จะเป็นองค์ประกอบหลักเพียงรายการเดียว ...
พอคุยโชว์บ้าง!
พอใช้; jsbin นี้จะอธิบายถึง 5 ตัวอย่างของสิ่งที่เกิดขึ้นเมื่อคุณทำและเมื่อคุณไม่ได้ใช้ng-repeat-end
บนแท็กเดียวกัน