AngularJS ile liste ayırıcı olarak virgül kullanma


179

Virgülle ayrılmış bir öğe listesi oluşturmak gerekir:

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

AngularJS belgelerine göre, ifadelerde hiçbir kontrol akış ifadesine izin verilmez. Bu yüzden benim {{$last ? '' : ', '}}çalışmıyor.

Virgülle ayrılmış listeler oluşturmanın alternatif bir yolu var mı?

DÜZENLEME 1'den
daha basit bir şey var:

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

5
Listeleri bu şekilde biçimlendirmek için her zaman CSS'yi kullanabilirsiniz (daha sonra patronunuz bunları ayrı satırlarda istediğinde HTML'yi değiştirmeniz gerekmez) - bkz. Stackoverflow.com/questions/1517220/…
AlexFoxGill

Yanıtlar:


338

Bunu şu şekilde yapabilirsiniz:

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

..Ama Philipp'in cevabını seviyorum :-)


Her ($last && '' || ', ')zaman verim olmaz ', 'mı?
okm

15
Yukarıdaki okm, bir şablon içinde $ true doğru veya false doğru değerlendirmek için açısal alamadım. Bunu kullandı: {{{true: '', false: ', '}[$last]}}. Bu teknik kullanmaktan daha esnektir, .joinçünkü listedeki elemanların her birinin bir dizinin üyesi olmasına izin verir, örneğin:<b ng-repeat="friend in friends">{{friend.email}}{{{true: '', false: ', '}[$last]}}</b>
Ryan Marcus

3
Üçlü operatörleri kullanmak için güncellendi
Andrew Joslin

1
Dizimi şöyle görünmesi için basılı diziye nasıl ekleyebilirim: John, Mike ve Nil. Yönerge kullanılmadan bu formatın edinilmesi.
MaTya

Listedeki her değer için bir filtre kullanmamı sağladığı için bu yaklaşımı kullanıyorum.
C Fairweather

231

join(separator)Diziler için Javascript'in yerleşik işlevini kullanmanız yeterlidir:

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

21
HTML-ish ayırıcıları istiyorsanız, büyük olasılıkla bir yazma yönergesinin zamanı gelmiştir . HTML'yi join()HTML çıkışına da ekleyebilir ve devre dışı bırakabilirsiniz, ancak bunun için cehennemde özel bir yer var;)
Philipp Reichart

Güzel, bu şekilde kullanmayı düşünmedim bile.
Çilek

@DavidKEgghead Farklı olmaya yalvarıyorum, jsfiddle.net/wuZRA . Sizin için nasıl çalışmıyor?
Philipp Reichart

2
@PhilippReichart gecikme için özür dilerim. İşte bir örnek: jsfiddle.net/Sek8F - bir nesneye atıfta bulunduğum bir dizeyi hedeflediğiniz gibi görünüyor.
Ravi Ram

101

Ayrıca:

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

Ve şablonda:

{{ itemsArray | joinBy:',' }}

11
Bu cevap "açısal yol" u gösterir ve en iyisi olarak işaretlenmelidir.
Eugene Griaznov

14
Neden altı satırdan tasarruf edip sadece yapmıyorsunuz {{ itemsArray.join(', ') }}?
Philipp Reichart

12
AngularJS'de JavaScript çekirdek işlevlerinin yeniden yazılmasının gerçekten "Açısal yol" olduğundan emin değilim ...
Michael Cole

1
Bu cevap, açısal nesnelerin dizileri için nasıl değer katabileceğini gösterir
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
Virgülle ayrılmış bir listeyi kullanma seçeneği tamamen sunumla ilgili olduğundan, bu en "anlamsal" şekilde görünür. Bir alt liste de olabilirdi.
Elliot Cameron

Aklıma gelen ilk çözüm buydu. JavaScript'e daha az bağımlı.
Kalpesh Panchal

10

Düzeltmek için CSS'yi de kullanabilirsiniz

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

Ama Andy Joslin'in cevabı en iyisi

Edit: Son zamanlarda bunu yapmak zorunda fikrimi değiştirdim ve bir katılma filtresi ile gidiş sona erdi.


2
Ben de özel bir filtre için gitmek istiyorum, ama senin fikrini seviyorum :)
JBC

5

Bence kullanmak daha iyi ng-if. ng-showiçinde bir öğe oluşturur domve bunu ayarlar display:none. Ne kadar çok domöğeye sahip olursanız uygulamanıza o kadar çok aç kalırsınız ve daha az kaynağa sahip cihazlardadom öğe o kadar iyi olur.

TBH <span ng-if="!$last">, </span>bunu yapmanın harika bir yolu gibi görünüyor. Basit.


Bu yaklaşımı seviyorum, çünkü basit ve hala html tabanlı ayırıcıları destekliyor. @77 teşekkürler!
alexkb

2

Bu soru oldukça eski olduğundan ve AngularJS'nin o zamandan bu yana gelişmeye zamanı olduğu için, bu artık şu şekilde kolayca gerçekleştirilebilir:

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

Çok daha fazla performans olduğu için ngBindenterpolasyon yerine kullanıyorum {{ }}: ngBind sadece iletilen değer gerçekten değiştiğinde çalışır. {{ }}Diğer yandan, köşeli parantezler , gerekli olmasa bile, her sindirimde kirli kontrol edilecek ve yenilenecektir. Kaynak: burada , burada ve burada .

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>

Son olarak, buradaki tüm çözümler işe yarar ve bugüne kadar geçerlidir. Bu gerçekten bir sunum meselesi olduğu için CSS içerenleri gerçekten buldum.


1

Ben simbu'nun yaklaşımını seviyorum, ama ilk çocuğu veya son çocuğu kullanmak rahat değil. Bunun yerine yalnızca yinelenen bir liste-virgül sınıfının içeriğini değiştiriyorum.

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

0

Değerleri sınırlamak için ng-show kullanıyorsanız {{$last ? '' : ', '}}, yine de tüm değerleri dikkate alacağı için çalışmaz.

<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 ile hala 4 değerin tümünü dikkate aldığından , "son" değerden sonra virgül eklemenin sonuçları

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

Bir çözüm, doğrudan ng-repeat'e bir filtre eklemektir.

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

Sonuçlar

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

Özel bir boru oluşturmadan Angular 2'de bu sorunun nasıl aynı şekilde çözüleceğine dair herhangi bir öneriniz var mı?
chaenu
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.