使用逗号作为AngularJS的列表分隔符

Fra*_*ger 178 angularjs angularjs-ng-repeat

我需要创建一个以逗号分隔的项目列表:

  <li ng-repeat="friend in friends">
      <b ng-repeat="email in friend.email">{{email}}{{$last ? '' : ', '}}</b>...
  </li>
Run Code Online (Sandbox Code Playgroud)

根据AngularJS文档,表达式中不允许使用控制流语句.这就是我{{$last ? '' : ', '}}无法工作的原因.

是否有另一种创建逗号分隔列表的方法?

编辑1
有一些比以下更简单:

<span ng-show="!$last">, </span>
Run Code Online (Sandbox Code Playgroud)

And*_*lin 336

你可以这样做:

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

..但我喜欢Philipp的回答:-)

  • 点击上面的okm,我无法在模板中正确评估$ last为true或false.我用过这个:`{{{true:'',false:','} [$ last]}}`.这种技术比使用`.join`更灵活,因为它允许列表中的元素成为数组的成员,例如:`<b ng-repeat ="朋友中的朋友"> {{friend.email}} { {{true:'',false:','} [$ last]}} </ b>` (15认同)
  • 更新为使用三元运算符 (3认同)
  • 它如此简单 (2认同)

Phi*_*art 228

只需使用Javascript的内置join(separator)函数进行数组:

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

  • 如果你想要HTML-ish分隔符,可能需要写一个[指令](http://docs.angularjs.org/guide/directive).您也可以将HTML放入`join()`并禁用HTML转义,但是地狱中有一个特殊的地方;) (21认同)
  • @PhilippReichart抱歉延误.这是一个例子:http://jsfiddle.net/Sek8F/ - 看起来你正在瞄准一个字符串,因为我指的是一个对象. (2认同)

san*_*art 98

也:

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

在模板中:

{{ itemsArray | joinBy:',' }}
Run Code Online (Sandbox Code Playgroud)

  • 为什么不保存六行,只做`{{itemsArray.join(',')}}`? (14认同)
  • 我不确定在AngularJS中重写JavaScript核心函数真的是"Angular方式"...... (12认同)
  • 这个答案显示"角度方式",应该被标记为最佳. (11认同)

小智 39

.list-comma::before {
  content: ',';
}
.list-comma:first-child::before {
  content: '';
}
Run Code Online (Sandbox Code Playgroud)
<span class="list-comma" ng-repeat="destination in destinations">
                            {{destination.name}}
                        </span>
Run Code Online (Sandbox Code Playgroud)


Chr*_*ens 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;
}
Run Code Online (Sandbox Code Playgroud)

但安迪·乔斯林的答案是最好的

编辑:我改变了主意,最近我不得不这样做,最后我选择了一个联接过滤器.

  • 我也会去自定义过滤器,但我喜欢你的想法:) (2认同)

小智 5

我觉得最好用ng-if.ng-show在中创建一个元素dom并设置它display:none.越多dom的元素,你有更多的资源饥渴您的应用程序变得和在低资源的设备越少dom的元素就更好了.

TBH <span ng-if="!$last">, </span>似乎是一种很好的方式.这很简单.