Sử dụng dấu phẩy làm dấu tách danh sách với AngularJS


179

Tôi cần tạo một danh sách các mục được phân tách bằng dấu phẩy:

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

Theo tài liệu AngularJS, không cho phép các câu lệnh điều khiển trong biểu thức. Đây là lý do tại sao của tôi {{$last ? '' : ', '}}không làm việc.

Có cách nào khác để tạo danh sách được phân tách bằng dấu phẩy không?

EDIT 1
có gì đó đơn giản hơn:

<span ng-show="!$last">, </span>

5
Bạn luôn có thể sử dụng CSS để định dạng danh sách theo cách này (sau đó bạn không cần sửa đổi HTML khi sếp của bạn muốn chúng trên các dòng riêng biệt, v.v.) - xem stackoverflow.com/questions/1517220/
Thẻ

Câu trả lời:


338

Bạn có thể làm theo cách này:

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

..Nhưng tôi thích câu trả lời của Philipp :-)


Không phải ($last && '' || ', ')lúc nào cũng nên mang lại ', '?
okm

15
Ở trên, tôi không thể đánh giá đúng $ cuối cùng thành đúng hay sai trong một mẫu. Tôi đã sử dụng này : {{{true: '', false: ', '}[$last]}}. Kỹ thuật này linh hoạt hơn so với sử dụng .joinvì nó cho phép các thành phần trong danh sách được từng thành viên của một mảng, như:<b ng-repeat="friend in friends">{{friend.email}}{{{true: '', false: ', '}[$last]}}</b>
Ryan Marcus

3
Cập nhật để sử dụng toán tử ternary
Andrew Joslin

1
Làm thế nào tôi có thể chèn và trong mảng in để mảng của tôi trông như thế này: John, Mike và Nil. Làm thế nào để có được định dạng này mà không cần sử dụng chỉ thị.
MaTya

Tôi đang sử dụng phương pháp này vì nó cho phép tôi sử dụng bộ lọc cho từng giá trị trong danh sách.
C Fairweather

231

Chỉ cần sử dụng join(separator)chức năng tích hợp của Javascript cho các mảng:

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

21
Nếu bạn muốn tách HTML-ish nó có thể là thời gian để một ghi chỉ thị . Bạn cũng có thể đưa HTML vào join()và vô hiệu hóa HTML thoát, nhưng có một vị trí đặc biệt trong địa ngục cho điều đó;)
Philipp Reichart

Thật tuyệt, tôi thậm chí không nghĩ về việc sử dụng nó theo cách này.
Dâu tây

@DavidKEgghead Tôi xin khác, jsfiddle.net/wuZRA . Làm thế nào nó không làm việc cho bạn?
Philipp Reichart

2
@PhilippReichart xin lỗi vì sự chậm trễ. Dưới đây là một ví dụ: jsfiddle.net/Sek8F - có vẻ như bạn đang nhắm mục tiêu một chuỗi trong đó như tôi đang đề cập đến một đối tượng.
Ravi Ram

101

Cũng thế:

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

Và trong mẫu:

{{ itemsArray | joinBy:',' }}

11
Câu trả lời này cho thấy "cách góc" và nên được đánh dấu là tốt nhất.
Eugene Griaznov

14
Tại sao không lưu sáu dòng và chỉ cần làm {{ itemsArray.join(', ') }}?
Philipp Reichart

12
Tôi không chắc việc viết lại các chức năng cốt lõi của JavaScript trong AngularJS thực sự là "cách thức góc cạnh" ...
Michael Cole

1
Câu trả lời này cho thấy Angular có thể thêm giá trị cho mảng các đối tượng
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
Đây có vẻ là cách "ngữ nghĩa" nhất, vì sự lựa chọn sử dụng danh sách được phân tách bằng dấu phẩy hoàn toàn là về cách trình bày. Nó cũng có thể là một danh sách con.
Elliot Cameron

Đây là giải pháp đầu tiên tôi nghĩ đến. Ít phụ thuộc vào JavaScript.
Kalpesh Panchal

10

Bạn cũng có thể sử dụng CSS để sửa nó

<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;
}

Nhưng câu trả lời của Andy Joslin là tốt nhất

Chỉnh sửa: Tôi đã thay đổi suy nghĩ của mình Tôi phải làm điều này gần đây và cuối cùng tôi đã đi với một bộ lọc tham gia.


2
Tôi cũng muốn có một bộ lọc tùy chỉnh, nhưng tôi thích ý tưởng của bạn :)
JBC

5

Tôi nghĩ rằng nó tốt hơn để sử dụng ng-if. ng-showtạo một phần tử trong domvà thiết lập nó display:none. Càng nhiều domyếu tố bạn càng có nhiều tài nguyên thì ứng dụng của bạn càng trở nên đói và trên các thiết bị có tài nguyên càng thấp thì càng ít domyếu tố càng tốt.

TBH <span ng-if="!$last">, </span>có vẻ như là một cách tuyệt vời để làm điều đó. Thật đơn giản.


Tôi thích cách tiếp cận này, vì nó đơn giản và vẫn hỗ trợ các dấu phân tách dựa trên html. Cảm ơn @ the7erm!
alexkb

2

Vì câu hỏi này khá cũ và AngularJS đã có thời gian để phát triển kể từ đó, giờ đây có thể dễ dàng đạt được bằng cách sử dụng:

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

Lưu ý rằng tôi đang sử dụng ngBindthay vì nội suy {{ }}vì nó hiệu quả hơn nhiều: ngBind sẽ chỉ chạy khi giá trị được truyền thực sự thay đổi. Mặt khác {{ }}, dấu ngoặc sẽ bị kiểm tra và làm mới bẩn trong mỗi $ digest, ngay cả khi không cần thiết. Nguồn: đây , đâyđây .

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>

Trên một lưu ý cuối cùng, tất cả các giải pháp ở đây hoạt động và có giá trị cho đến ngày nay. Tôi thực sự tìm thấy những người liên quan đến CSS vì đây là vấn đề trình bày nhiều hơn.


1

Tôi thích cách tiếp cận của simbu, nhưng tôi không thoải mái khi sử dụng con đầu hoặc con cuối. Thay vào đó tôi chỉ sửa đổi nội dung của một lớp danh sách lặp lại.

.list-comma + .list-comma::before {
    content: ', ';
}
<span class="list-comma" ng-repeat="destination in destinations">
    {{destination.name}}
</span>

0

Nếu bạn đang sử dụng ng-show để giới hạn các giá trị, thì {{$last ? '' : ', '}}sẽ không hoạt động vì nó vẫn sẽ xem xét tất cả các giá trị. Ví dụ

<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"}
  ]
});

Kết quả trong việc thêm dấu phẩy sau giá trị "cuối cùng" , vì với ng-show, nó vẫn xem xét cả 4 giá trị

{"email":"1"},
{"email":"1"},

Một giải pháp là thêm bộ lọc trực tiếp vào ng-repeat

<div ng-repeat="x in records | filter: { email : '1' } ">{{x}}{{$last ? '' : ', '}}</div>

Các kết quả

{"email":"1"},
{"email":"1"}

Có gợi ý nào về cách giải quyết vấn đề này theo cách tương tự trong Angular 2 mà không tạo đường ống tùy chỉnh không?
chaothy
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.