Sắp xếp thả xuống theo thứ tự abc trong AngularJS


158

Tôi đang đưa ra một danh sách thả xuống thông qua việc sử dụng các tùy chọn ng được nối với bộ điều khiển mà đến lượt nó đang gọi một dịch vụ. Thật không may, dữ liệu đến là một mớ hỗn độn và tôi cần có thể sắp xếp nó theo thứ tự abc.

Bạn nghĩ rằng một cái gì đó như $.sortBysẽ làm điều đó nhưng thật không may, nó đã không làm được. Tôi biết tôi có thể sắp xếp nó thông qua javascript bằng phương thức trợ giúp function asc(a,b)hoặc đại loại như thế nhưng tôi từ chối tin rằng không có cách nào sạch hơn để làm điều này cộng với tôi không muốn làm hỏng bộ điều khiển bằng các phương thức trợ giúp. Đó là một cái gì đó rất cơ bản về nguyên tắc vì vậy tôi không hiểu tại sao AngularJS không có thứ này.

Có cách nào để làm một cái gì đó như thế $orderBy('asc')nào?

Thí dụ:

<select ng-option="items in item.$orderBy('asc')"></select>

Sẽ rất hữu ích khi có các tùy chọn orderByđể bạn có thể làm bất cứ điều gì bạn muốn, bất cứ khi nào bạn thường cố gắng sắp xếp dữ liệu.

Câu trả lời:


342

Angular có bộ lọc orderBy có thể được sử dụng như thế này:

<select ng-model="selected" ng-options="f.name for f in friends | orderBy:'name'"></select>

Xem fiddle này cho một ví dụ.

Điều đáng chú ý là nếu track byđang được sử dụng, nó cần xuất hiện sau orderBybộ lọc, như thế này:

<select ng-model="selected" ng-options="f.name for f in friends | orderBy:'name' track by f.id"></select>

1
Nhìn vào fiddle (hoặc thêm một thẻ chọn sắp xếp vào hướng dẫn Angular ToDo), việc có một tùy chọn để hiển thị là 'được chọn' - hoặc thậm chí nhận được tùy chọn đầu tiên để hiển thị - là một vấn đề. Với Angular nó trống không?
Dave Everitt

2
@DaveEveritt một cách để đặt mặc định (và xóa mục trống) là chọn trước một mục bị ràng buộc cho selected. Đối với ví dụ này, bạn có thể làm một cái gì đó như $scope.selected = $scope.friends[0]. Xem fiddle này cho một mẫu làm việc.
Bản đồ

Điều gì xảy ra nếu tôi muốn tuổi là giá trị được chọn, không phải toàn bộ phần tử JSON?
Rishi

@Rishi hãy thử điều này cho các tùy chọn ng: f.age as f.name for f in friends | orderBy:'name'- đây là một fiddle hoạt động. Thêm về ng-tùy chọn ở đây .
Gloopy

7
@Gloopy, câu trả lời này đã giúp tôi đạt 90%. Bạn có phiền khi thêm một trường hợp khi theo dõi được sử dụng? <select ng-model="selected" ng-options="f.name for f in friends | orderBy:'name' track by f.id"></selected>. Đặt track bysau bộ lọc đơn hàng không trực quan và câu trả lời này là kết quả tìm kiếm hàng đầu từ google.
MushinNoShin

26

Bạn sẽ có thể sử dụng bộ lọc: orderBy

orderBycó thể chấp nhận một lựa chọn thứ ba cho reversecờ.

<select ng-option="item.name for item in items | orderBy:'name':true"></select>

Ở đây mục được sắp xếp theo thuộc tính 'name' theo thứ tự đảo ngược. Đối số thứ 2 có thể là bất kỳ hàm thứ tự nào, vì vậy bạn có thể sắp xếp theo bất kỳ quy tắc nào.

@see http://docs.angularjs.org/api/ng.filter:orderBy


6
Hoặc chỉ <select ng-tùy chọn = "item.name cho mục trong mục | orderBy: '- name'"> </ select> Hoạt động quá :)
Mahbub

2
var module = angular.module("example", []);

module.controller("orderByController", function ($scope) {
    $scope.orderByValue = function (value) {
        return value;
    };

    $scope.items = ["c", "b", "a"];
    $scope.objList = [
        {
            "name": "c"
        }, {
            "name": "b"
        }, {
            "name": "a"
        }];
        $scope.item = "b";
    });

http://jsfiddle.net/Nfv42/65/


2
Một chút văn bản giải thích làm thế nào điều này trả lời câu hỏi của OP và / hoặc cách bạn sẽ sử dụng nó sẽ rất hữu ích ở đây.
Sean the Bean

@SeantheBean tôi đã đưa ra bản demo fiddle vì vậy tôi đã không đưa ra lời giải thích.
TechnoCrat

2
@TechnoCrat Một lời giải thích dù sao cũng sẽ thích hợp hơn. Trên thực tế, sẽ rất thú vị khi biết lý do tại sao giải pháp này sẽ được ưa thích hơn những giải pháp được đăng trước đó. Hoặc, nó khác nhau như thế nào ...
Chipowski

@Chipowski ok. Đi về phía trước tôi sẽ cố gắng đưa ra lời giải thích cùng với câu trả lời.
TechnoCrat

0

Đối với bất cứ ai muốn sắp xếp biến trong lớp thứ ba:

<select ng-option="friend.pet.name for friend in friends"></select>

bạn có thể làm như thế này

<select ng-option="friend.pet.name for friend in friends | orderBy: 'pet.name'"></select>
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.