Использование запятой в качестве разделителя списка с AngularJS
мне нужно создать разделенный запятыми список элементов:
<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>
8 ответов:
вы могли бы сделать это таким образом:
<b ng-repeat="email in friend.email">{{email}}{{$last ? '' : ', '}}</b>..Но мне нравится ответ Филиппа :-)
просто используйте встроенный Javascript
join(separator)функции для массивов:<li ng-repeat="friend in friends"> <b>{{friend.email.join(', ')}}</b>... </li>
также:
angular.module('App.filters', []) .filter('joinBy', function () { return function (input,delimiter) { return (input || []).join(delimiter || ','); }; });и в шаблоне:
{{ itemsArray | joinBy:',' }}
.list-comma::before { content: ','; } .list-comma:first-child::before { content: ''; }<span class="list-comma" ng-repeat="destination in destinations"> {{destination.name}} </span>
вы можете использовать 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; }но ответ Энди Джослина лучше
Edit: я передумал, я должен был сделать это недавно, и я закончил тем, что пошел с фильтром соединения.
Я думаю, что лучше использовать
ng-if.ng-showсоздает элементdomи поdisplay:none. Тем болееdomэлементы у вас есть больше ресурсов голодных ваше приложение становится, и на устройствах с более низкими ресурсами меньшеdomэлементы, тем лучше.TBH
<span ng-if="!$last">, </span>кажется, отличный способ сделать это. Все очень просто.
так как этот вопрос довольно старый и AngularJS было время, чтобы развиваться с тех пор, теперь это может быть легко достигнуто с помощью:
<li ng-repeat="record in records" ng-bind="record + ($last ? '' : ', ')"></li>.обратите внимание, что я использую
ngBindвместо интерполяции{{ }}как это гораздо более производительным:ngBindбудет работать только когда переданное значение не измениться. Скобки{{ }}, С другой стороны, будет грязно проверено и Обновлено в каждом $digest, даже если это не обязательно. Источник: здесь,здесь и здесь.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, поскольку это больше проблема презентации.
если вы используете 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"},одним из решений является добавление фильтра прямо в НГ-повтор
<div ng-repeat="x in records | filter: { email : '1' } ">{{x}}{{$last ? '' : ', '}}</div>результаты
{"email":"1"}, {"email":"1"}
Comments