การใช้เครื่องหมายจุลภาคเป็นตัวคั่นรายการกับ AngularJS


179

ฉันต้องการสร้างรายการที่คั่นด้วยเครื่องหมายจุลภาค:

  <li ng-repeat="friend in friends">
      <b ng-repeat="email in friend.email">{{email}}{{$last ? '' : ', '}}</b>...
  </li>

ตามเอกสารของ AngularJS ไม่อนุญาตให้ใช้คำสั่งการควบคุมการไหลในนิพจน์ นี่คือเหตุผลที่ฉัน{{$last ? '' : ', '}}ไม่ทำงาน

มีวิธีอื่นในการสร้างรายการที่คั่นด้วยเครื่องหมายจุลภาคหรือไม่

แก้ไข 1
มีสิ่งที่ง่ายกว่า:

<span ng-show="!$last">, </span>

5
คุณสามารถใช้ CSS เพื่อจัดรูปแบบรายการได้ด้วยวิธีนี้ (จากนั้นคุณไม่จำเป็นต้องแก้ไข HTML เมื่อเจ้านายของคุณต้องการแยกบรรทัดอื่น ๆ ) - ดูstackoverflow.com/questions/1517220/…
AlexFoxGill

คำตอบ:


338

คุณสามารถทำได้ด้วยวิธีนี้:

<b ng-repeat="email in friend.email">{{email}}{{$last ? '' : ', '}}</b>

.. แต่ฉันชอบคำตอบของ Philipp :-)


ไม่ควร($last && '' || ', ')จะยอมแพ้เสมอไป', '?
okm

15
ดูโอเคข้างบนฉันไม่สามารถหามุมที่จะประเมิน $ ล่าสุดเป็นจริงหรือเท็จภายในเทมเพลต ฉันใช้สิ่งนี้: {{{true: '', false: ', '}[$last]}}. เทคนิคนี้มีความยืดหยุ่นมากกว่าการใช้.joinเพราะช่วยให้องค์ประกอบในรายการแต่ละคนเป็นสมาชิกของอาร์เรย์เช่น:<b ng-repeat="friend in friends">{{friend.email}}{{{true: '', false: ', '}[$last]}}</b>
ไรอันมาร์คัส

3
อัปเดตเพื่อใช้ผู้ประกอบการที่ประกอบไปด้วย
Andrew Joslin

1
ฉันจะแทรกและในอาร์เรย์ที่พิมพ์อย่างไรเพื่อให้อาร์เรย์ของฉันมีลักษณะดังนี้: John, Mike และ Nil วิธีรับรูปแบบนี้โดยไม่ใช้คำสั่ง
MaTya

ฉันใช้วิธีการนี้เนื่องจากช่วยให้ฉันสามารถใช้ตัวกรองในแต่ละค่าในรายการ
C Fairweather

231

เพียงใช้join(separator)ฟังก์ชันในตัวของ Javascript สำหรับอาร์เรย์:

<li ng-repeat="friend in friends">
  <b>{{friend.email.join(', ')}}</b>...
</li>

21
หากคุณต้องการแยก HTML-ish มันอาจจะถึงเวลาที่จะเขียนคำสั่ง นอกจากนี้คุณยังสามารถใส่ HTML join()และปิดการใช้งานการหลบหนี HTML แต่มีสถานที่พิเศษในนรกสำหรับสิ่งนั้น)
24425 Philipp

ดีฉันไม่ได้คิดเกี่ยวกับการใช้วิธีนี้
สตรอเบอร์รี่

@DavidKEgghead ผมขอแตกต่างกัน, jsfiddle.net/wuZRA มันไม่ทำงานสำหรับคุณอย่างไร
Philipp Reichart

2
@PhilippReichart ขออภัยในความล่าช้า นี่คือตัวอย่าง: jsfiddle.net/Sek8F - ดูเหมือนว่าคุณกำลังกำหนดเป้าหมายสตริงที่ซึ่งฉันกำลังอ้างอิงถึงวัตถุ
Ravi Ram

101

นอกจากนี้:

angular.module('App.filters', [])
    .filter('joinBy', function () {
        return function (input,delimiter) {
            return (input || []).join(delimiter || ',');
        };
    });

และในเทมเพลต:

{{ itemsArray | joinBy:',' }}

11
คำตอบนี้แสดง "เชิงมุม" และควรระบุว่าดีที่สุด
Eugene Griaznov

14
ทำไมไม่บันทึกหกบรรทัดและทำเช่นนั้น{{ itemsArray.join(', ') }}?
Philipp Reichart

12
ฉันไม่แน่ใจว่าการเขียนฟังก์ชั่นหลักจาวาสคริปต์ใน AngularJS จริงๆแล้วเป็น "วิธีเชิงมุม" ...
Michael Cole

1
คำตอบนี้แสดงให้เห็นว่า Angular สามารถเพิ่มมูลค่าให้กับอาร์เรย์ของวัตถุได้อย่างไร
Michael Cole

41

.list-comma::before {
  content: ',';
}
.list-comma:first-child::before {
  content: '';
}
<span class="list-comma" ng-repeat="destination in destinations">
                            {{destination.name}}
                        </span>


1
สิ่งนี้ดูเหมือนจะเป็น "ความหมาย" ที่สุดเนื่องจากตัวเลือกในการใช้รายการที่คั่นด้วยเครื่องหมายจุลภาคนั้นเกี่ยวกับการนำเสนอทั้งหมด มันอาจเป็นรายการย่อยก็ได้เช่นกัน
Elliot Cameron

นี่เป็นทางออกแรกที่เข้ามาในใจฉัน พึ่งพา JavaScript น้อยลง
Kalpesh Panchal

10

คุณสามารถใช้ CSS เพื่อแก้ไขได้เช่นกัน

<div class="some-container">
[ <span ng-repeat="something in somethings">{{something}}<span class="list-comma">, </span></span> ]
</div>

.some-container span:last-child .list-comma{
    display: none;
}

แต่คำตอบของ Andy Joslin นั้นดีที่สุด

แก้ไข: ฉันเปลี่ยนใจฉันต้องทำสิ่งนี้เมื่อไม่นานมานี้และฉันก็ลงเอยด้วยฟิลเตอร์เข้าร่วม


2
ฉันไปสำหรับตัวกรองที่กำหนดเองเกินไป แต่ผมชอบความคิดของคุณ :)
JBC

5

ng-ifผมคิดว่ามันจะดีกว่าที่จะใช้ ng-showสร้างองค์ประกอบในและชุดมันdom องค์ประกอบdisplay:noneยิ่งdomคุณมีทรัพยากรมากขึ้นเรื่อย ๆ ทำให้แอปของคุณกลายเป็นทรัพยากรมากขึ้นและในอุปกรณ์ที่มีทรัพยากรต่ำจะทำให้domองค์ประกอบที่น้อยกว่าดีขึ้น

TBH <span ng-if="!$last">, </span>ดูเหมือนเป็นวิธีที่ยอดเยี่ยมที่จะทำ มันง่ายมาก


ฉันชอบวิธีการนี้เนื่องจากมันง่ายและยังคงรองรับตัวคั่นตาม html ขอบคุณ @ the7erm!
alexkb

2

เนื่องจากคำถามนี้ค่อนข้างเก่าและ AngularJS มีเวลาพัฒนาตั้งแต่นั้นมาตอนนี้สามารถทำได้โดยใช้:

<li ng-repeat="record in records" ng-bind="record + ($last ? '' : ', ')"></li>.

โปรดทราบว่าฉันกำลังใช้ngBindแทนการแก้ไข{{ }}เนื่องจากมันมีประสิทธิภาพมากกว่า: ngBind จะทำงานเฉพาะเมื่อค่าที่ส่งผ่านเปลี่ยนไปจริง ๆ เท่านั้น ในทางกลับกันวงเล็บ{{ }}จะสกปรกมีการตรวจสอบและรีเฟรชในทุก ๆ ดอลลาร์ย่อยแม้ว่าจะไม่จำเป็นก็ตาม ที่มา: ที่นี่ , ที่นี่และที่นี่

angular
  .module('myApp', [])
  .controller('MyCtrl', ['$scope',
    function($scope) {
      $scope.records = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
    }
  ]);
li {
  display: inline-block;
}
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.7/angular.min.js"></script>
<div ng-app="myApp" ng-controller="MyCtrl">
  <ul>
    <li ng-repeat="record in records" ng-bind="record + ($last ? '' : ', ')"></li>
  </ul>
</div>

ในหมายเหตุสุดท้ายโซลูชันทั้งหมดที่นี่ใช้งานได้และใช้ได้จนถึงทุกวันนี้ ฉันพบผู้ที่เกี่ยวข้องกับ CSS จริงๆเพราะนี่เป็นปัญหาการนำเสนอมากกว่า


1

ฉันชอบแนวทางของ simbu แต่ฉันไม่สะดวกที่จะใช้ลูกคนแรกหรือลูกคนสุดท้าย แต่ฉันจะแก้ไขเนื้อหาของ list-comma class ที่ทำซ้ำเท่านั้น

.list-comma + .list-comma::before {
    content: ', ';
}
<span class="list-comma" ng-repeat="destination in destinations">
    {{destination.name}}
</span>

0

หากคุณกำลังใช้ ng-show เพื่อ จำกัด ค่าต่างๆจะ{{$last ? '' : ', '}}ไม่ทำงานเนื่องจากจะยังคำนึงถึงค่าทั้งหมดตัวอย่าง

<div ng-repeat="x in records" ng-show="x.email == 1">{{x}}{{$last ? '' : ', '}}</div>

var myApp = angular.module("myApp", []);
myApp.controller("myCtrl", function($scope) {
  $scope.records = [
    {"email": "1"},
    {"email": "1"},
    {"email": "2"},
    {"email": "3"}
  ]
});

ผลลัพธ์ในการเพิ่มเครื่องหมายจุลภาคหลังค่า "ล่าสุด"เนื่องจากด้วย ng-show มันยังคงคำนึงถึงค่าทั้ง 4

{"email":"1"},
{"email":"1"},

ทางออกหนึ่งคือการเพิ่มตัวกรองลงใน ng-repeat โดยตรง

<div ng-repeat="x in records | filter: { email : '1' } ">{{x}}{{$last ? '' : ', '}}</div>

ผล

{"email":"1"},
{"email":"1"}

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