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
あなたはいつも(あなたはあなたの上司が別の行などでそれらを望んでいる時にHTMLを変更する必要はありません)このように、フォーマットリストにCSSを使用することができます-参照stackoverflow.com/questions/1517220/...を
AlexFoxGill

回答:


338

あなたはこのようにすることができます:

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

..しかし、私はフィリップの答えが好きです:-)


($last && '' || ', ')常に譲る必要はありません', 'か?
okm 2013年

15
上記のように、テンプレート内で$ lastをtrueまたはfalseに適切に評価する角度を取得できませんでした。私はこれを使用しました:{{{true: '', false: ', '}[$last]}}。この技術は、使用するよりも柔軟である.join:それは同様に、アレイの各BEメンバーにリスト内の要素を可能にするために<b ng-repeat="friend in friends">{{friend.email}}{{{true: '', false: ', '}[$last]}}</b>
ライアンマーカス

3
三項演算子を使用するように更新
Andrew Joslin 2013年

1
配列が次のようになるように、印刷された配列を挿入および挿入するにはどうすればよいですか:John、Mike、Nil。ディレクティブを使用せずにこのフォーマットを取得する方法。
MaTya 14

リストの各値にフィルターを使用できるため、このアプローチを使用しています。
Cフェアウェザー2016

231

join(separator)配列にはJavaScriptの組み込み関数を使用するだけです。

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

21
HTML風のセパレータが必要な場合は、おそらく書き込みディレクティブを使用します。HTMLを挿入join()してHTMLエスケープを無効にすることもできますが、そのためには特別な場所があります;)
Philipp Reichart

このように使用することさえ考えていませんでした。
イチゴ

@DavidKEgghead私は、不賛成jsfiddle.net/wuZRAを。それはあなたにとってどのように機能しないのですか?
Philipp Reichart、2014年

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 2014

14
6行を保存せず、ただ実行しませ{{ itemsArray.join(', ') }}んか?
Philipp Reichart、2015

12
AngularJSでJavaScriptのコア関数を書き直すことが本当に「Angularの方法」であるかはわかりません...
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 2017

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

しかし、アンディジョスリンの答えは最高です

編集:私は最近これをしなければならなかったという考えを変え、結局結合フィルターを使用することになりました。


2
私もカスタムフィルターを選びますが、あなたのアイデアが好きです:)
JBC

5

使用しng-ifた方がいいと思います。ng-showに要素を作成し、domそれをに設定しdisplay:noneます。dom要素が多ければ多いほど、アプリはリソースを大量に消費し、リソースが少ないデバイスでは少なくなります。dom要素が的です。

TBH <span ng-if="!$last">, </span>はそれを行うための素晴らしい方法のようです。それは簡単です。


シンプルでありながらHTMLベースのセパレータをサポートしているため、このアプローチが気に入っています。@ the7ermに感謝!
alexkb 2016

2

この質問はかなり古く、それ以来AngularJSは進化する時間を持っていたので、これを使用して簡単に達成できます。

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

ngBind補間の代わりに使用していることに注意してください。これは{{ }}パフォーマンスがはるかに高い ngBind ためです。渡された値が実際に変更された場合にのみ実行されます。{{ }}一方、ブラケットは、必要がない場合でも、すべての$ digestでダーティチェックおよび更新されます。出典:こちらhereおよびhere

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

私はシンブのアプローチが好きですが、ファーストチャイルドやラストチャイルドを使うのは快適ではありません。代わりに、繰り返しリストカンマクラスのコンテンツのみを変更します。

.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"},

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.