我需要创建以逗号分隔的项目列表:
<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>
答案 0 :(得分:333)
你可以这样做:
<b ng-repeat="email in friend.email">{{email}}{{$last ? '' : ', '}}</b>
..但我喜欢Philipp的答案: - )
答案 1 :(得分:221)
只需对数组使用Javascript的内置join(separator)
函数:
<li ng-repeat="friend in friends">
<b>{{friend.email.join(', ')}}</b>...
</li>
答案 2 :(得分:97)
此外:
angular.module('App.filters', [])
.filter('joinBy', function () {
return function (input,delimiter) {
return (input || []).join(delimiter || ',');
};
});
在模板中:
{{ itemsArray | joinBy:',' }}
答案 3 :(得分:39)
.list-comma::before {
content: ',';
}
.list-comma:first-child::before {
content: '';
}
<span class="list-comma" ng-repeat="destination in destinations">
{{destination.name}}
</span>
答案 4 :(得分: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;
}
但安迪·乔斯林的答案是最好的
编辑:我改变了主意,最近我不得不这样做,最后我选择了一个连接过滤器。
答案 5 :(得分:5)
我认为最好使用ng-if
。 ng-show
在dom
中创建了一个元素,并将其设置为display:none
。您拥有的dom
元素越多,您的应用所占用的资源就越多,而在资源较少的设备上,dom
元素越少越好。
TBH <span ng-if="!$last">, </span>
似乎是一种很好的方式。这很简单。
答案 6 :(得分:2)
由于这个问题已经很久了,AngularJS从那时起就有时间发展,现在可以通过以下方式轻松实现:
<li ng-repeat="record in records" ng-bind="record + ($last ? '' : ', ')"></li>
。
请注意,我使用的是ngBind
而不是插值{{ }}
,因为它的性能要高得多: ngBind
只会在传递的值实际发生变化时运行。另一方面,括号{{ }}
将在每个$摘要中进行脏检查和刷新,即使没有必要。来源:here,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的那些,因为这更像是一个演示问题。
答案 7 :(得分:1)
我喜欢simbu的方法,但是我不习惯使用第一个孩子或最后一个孩子。相反,我仅修改重复的列表逗号类的内容。
.list-comma + .list-comma::before {
content: ', ';
}
<span class="list-comma" ng-repeat="destination in destinations">
{{destination.name}}
</span>
答案 8 :(得分: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"}
]
});
Results in adding a comma after the "last" value,因为使用ng-show它仍然会考虑所有4个值
{"email":"1"},
{"email":"1"},
One solution is to add a filter直接进入ng-repeat
<div ng-repeat="x in records | filter: { email : '1' } ">{{x}}{{$last ? '' : ', '}}</div>
结果
{"email":"1"},
{"email":"1"}