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

15
위와 마찬가지로 템플릿 내에서 $ last를 true 또는 false로 올바르게 평가하기 위해 각도를 얻을 수 없었습니다. 나는 이것을 사용했다 : {{{true: '', false: ', '}[$last]}}. 이 기술은 .join목록의 요소가 각각 다음과 같이 배열의 구성원이 될 수 있기 때문에 사용하는 것보다 융통성이 있습니다.<b ng-repeat="friend in friends">{{friend.email}}{{{true: '', false: ', '}[$last]}}</b>
Ryan Marcus

3
삼항 연산자를 사용하도록 업데이트
Andrew Joslin

1
배열이 다음과 같이 보이도록 인쇄 배열을 어떻게 삽입하고 삽입 할 수 있습니까? John, Mike 및 Nil. 지시문을 사용하지 않고이 형식을 얻는 방법.
MaTya

이 방법을 사용하면 목록의 각 값에 필터를 사용할 수 있습니다.
C Fairweather

231

join(separator)배열 에 Javascript의 내장 함수를 사용하십시오.

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

21
HTML-ish 구분 기호를 원한다면 아마도 write 지시어 를 사용해야 할 때 입니다. HTML을 넣거나 HTML join()이스케이프를 비활성화 할 수도 있지만, 지옥에는 특별한 장소가 있습니다.)
Philipp Reichart

좋아, 나는 이것을 이런 식으로 사용하려고 생각조차하지 않았다.
딸기

@DavidKEgghead 나는 다르다고 jsfiddle.net/wuZRA을 . 어떻게 작동하지 않습니까?
Philipp Reichart

2
@PhilippReichart 지연해서 죄송합니다. 다음은 예입니다. jsfiddle.net/Sek8F- 객체를 참조 할 때 문자열을 대상으로하는 것처럼 보입니다.
라비 램

101

또한:

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

그리고 템플릿에서 :

{{ itemsArray | joinBy:',' }}

11
이 답변은 "각도 (angular way)"를 나타내며 최고로 표시되어야합니다.
유진 Griaznov

14
왜 여섯 줄을 저장하고 그냥하지 {{ itemsArray.join(', ') }}?
Philipp Reichart 2019

12
AngularJS에서 JavaScript 핵심 함수를 다시 작성하는 것이 실제로 "각도 방식"인지 잘 모르겠습니다.
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

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

2

이 질문은 상당히 오래되었고 AngularJS는 그 이후로 발전 할 시간이 있었으므로 이제 다음을 사용하여 쉽게 달성 할 수 있습니다.

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

훨씬 더 성능 ngBind이 좋기 {{ }}때문에 보간 대신 사용 ngBind 하고 있습니다. 전달 된 값이 실제로 변경 될 때만 실행됩니다. 반면에 괄호 {{ }}는 불필요하더라도 모든 $ 다이제스트에서 더티 검사 및 새로 고침됩니다. 출처 : here , herehere .

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

나는 simbu의 접근 방식을 좋아하지만 첫 번째 자식이나 마지막 자식을 사용하는 것이 편안하지 않습니다. 대신 반복되는 목록 쉼표 클래스의 내용 만 수정합니다.

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

한 가지 해결책은 필터 를 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.