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.