我有一个项目清单......
$scope.Users =[{
UserName: ''
}];
在我看来,我希望将它们列为这样,假设我的$scope:Users
只有4个项目
Username1, Username2, Username3 and Username4
<span data-ng-repeat="user in Users">{{user.Username}}</span>{{$last ? '' : ', '}}
上面的表达式基本上会在每个项目后添加逗号并且工作正常。
我的问题是如何在最后一项之前添加and
关键字,以便它像:
Username1, Username2, Username3 and Username4
而不是:
Username1, Username2, Username3, Username4
答案 0 :(得分:53)
$ last是truthy值..所以它保持true或false并且它不包含最后一个元素索引..
我想下面的表达应该可以解决你的问题
<p><span ng-repeat="user in Users">
{{user.Username}} {{$last ? '' : ($index==Users.length-2) ? ' and ' : ', '}}
</span></p>
还要确保在ng-repeat元素中包含$ last的表达式,而不是在
之外请检查以下工作小提琴
答案 1 :(得分:25)
这可能是解决方案之一
title
答案 2 :(得分:20)
<span ng-repeat="user in Users">{{$first ? '' : $last ? ' and ' : ', '}}{{user.Username}}</span>
而不是附加某些内容。您可以使用$first
省略第一个。然后,您可以使用$last
添加&#34;和&#34;而不是逗号。
答案 3 :(得分:9)
Bill Gates向Username1,Username2和Username3捐赠600万。
vs
Bill Gates向Username1,Username2和Username3捐赠了600万。
如果没有连续逗号,则句子不能清楚地表明每个用户将获得相等的份额。
<span ng-repeat="user in Users">
{{user.Username}}{{$last ? '' : ($index==Username.length-2) ? ', and ' : ', '}}
</span>
输出:
Username1, Username2, Username3, and Username4
答案 4 :(得分:4)
如果您只需要文本输出,请使用自定义过滤器而不是ng-repeat
:
<span>{{Users | humanizedUserList}}</span>
过滤器代码是这样的(使用Lodash):
app.filter('humanizedUserList', function() {
return function(users) {
var last_users = _.last(users, 2);
return _.reduce(users, function(out, user, idx, users) {
out += user.UserName;
if(user === last_users[1]) { // last entry
return out;
}
else if(user === last_users[0]) { // second to last entry
return out + ', and ';
}
else {
return out + ', ';
}
});
};
}
您可以避免在$last
和三元运算符之外使用ng-repeat
,并为应用程序的其他部分添加可重用性。
答案 5 :(得分:4)
我今天遇到了这个问题,但是额外的挑战是列表项可能需要在句子中格式化(例如,粗体或链接)。所以只是从过滤器输出一个字符串是行不通的。最初我尝试使用ng-bind-html并从过滤器输出HTML,但这不够灵活。
我最终制作了一个可以在任何ng-repeat中使用的指令,用于在列表项之间添加分隔符。棘手的部分是我只能访问$ first,$ last和$ index(不是原始数组或其长度!)。
我的解决方案:
var app = angular.module('app', []);
app.directive('listSeparator', function() {
return {
replace: true,
template: '<span>{{ separator }}</span>',
link: function(scope, elem, attrs) {
scope.$watchGroup(["$index", "$first", "$last"], function() {
if (scope.$first)
scope.separator = "";
else if (scope.$last && scope.$index == 1)
scope.separator = " and ";
else if (scope.$last)
scope.separator = ", and ";
else
scope.separator = ",";
})
}
}
})
&#13;
<script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.3.10/angular.min.js"></script>
<div ng-app="app">
Click a button to see the formatted list.
<button ng-click="myArray = ['one']">One item</button>
<button ng-click="myArray = ['one','two']">Two items</button>
<button ng-click="myArray = ['one','two','three']">Three items</button><br>
<span ng-repeat="item in myArray"><list-separator></list-separator>
<strong>{{item}}</strong></span>
</div>
&#13;
享受!