orderBy nhiều lĩnh vực trong Angular


382

Làm thế nào để sắp xếp bằng cách sử dụng nhiều trường cùng một lúc trong góc? nắm tay theo nhóm và sau đó theo nhóm phụ

$scope.divisions = [{'group':1,'sub':1}, {'group':2,'sub':10}, {'group':1,'sub':2},{'group':1,'sub':20},{'group':2,'sub':1},
    {'group':2,'sub':11}];

Tôi muốn hiển thị cái này như

nhóm: Tiểu nhóm

1 - 1

1 - 2

1 - 20

2 - 1

2 - 10

2-11

<select ng-model="divs" ng-options="(d.group+' - '+d.sub) for d in divisions | orderBy:'group' | orderBy:'sub'" />

Câu trả lời:


659

Xin vui lòng xem điều này:

http://jsfiddle.net/JSWorld/Hp4W7 / 32 /

<div ng-repeat="division in divisions | orderBy:['group','sub']">{{division.group}}-{{division.sub}}</div>

137
orderBy:['-group','sub']để sắp xếp theo groupthứ tự ngược lại.
Dmitriy

1
Trường nhóm có được ưu tiên đứng đầu trong Danh sách orderBy không?
luchosrock

5
@luchosrock, đúng vậy, như mong đợi. Chơi với jsfiddle được cung cấp dễ dàng xác nhận mức độ ưu tiên sắp xếp là từ trái sang phải cho các trường sắp xếp được cung cấp.
Patrick Refondini

2
Lưu ý rằng tham số ReverseOrder tùy chọn không hỗ trợ một mảng như tham số biểu thức, nhưng bạn có thể bỏ qua nó và thay vào đó cung cấp thứ tự sắp xếp trên từng mục mảng để chúng được đảo ngược (hoặc không) riêng rẽ. Ví dụ: orderBy: ['nhóm', '-sub'] sẽ sắp xếp theo nhóm theo cách thông thường, sau đó theo phụ theo thứ tự ngược lại. Có thể nhận được một số kết hợp phức tạp theo cách này.
Daniel Nalbach

1
Chúng tôi đã mô phỏng mức độ ưu tiên trong cửa hàng của mình bằng cách cung cấp cho các mục mảng một thuộc tính boolean, sau đó sử dụng tùy chọn đó làm tùy chọn đầu tiên. Ví dụ: orderBy: ['-featured', 'title'], khiến các mục thực sự nổi bật ở trên cùng (theo thứ tự abc), sau đó phần còn lại của các mục được liệt kê theo thứ tự bảng chữ cái.
Daniel Nalbach


21
<select ng-model="divs" ng-options="(d.group+' - '+d.sub) for d in divisions | orderBy:['group','sub']" />

Mảng người dùng thay vì nhiều orderBY


5

Sắp xếp có thể được thực hiện bằng cách sử dụng bộ lọc 'orderBy' theo góc.

Hai cách: 1. Từ chế độ xem 2. Từ bộ điều khiển

  1. Từ quan điểm

Cú pháp:

{{array | orderBy : expression : reverse}} 

Ví dụ:

 <div ng-repeat="user in users | orderBy : ['name', 'age'] : true">{{user.name}}</div>
  1. Từ bộ điều khiển

Cú pháp:

$filter.orderBy(array, expression, reverse);

Ví dụ:

$scope.filteredArray = $filter.orderBy($scope.users, ['name', 'age'], true);

5

Có 2 cách thực hiện các bộ lọc AngularJs, một trong HTML sử dụng {{}} và một trong các tệp JS thực tế ...

Bạn có thể giải quyết vấn đề bằng cách sử dụng:

{{ Expression | orderBy : expression : reverse}}

nếu bạn sử dụng nó trong HTML hoặc sử dụng cái gì đó như:

$filter('orderBy')(yourArray, yourExpression, reverse)

Đảo ngược là tùy chọn ở cuối, nó chấp nhận boolean và nếu nó đúng, nó sẽ đảo ngược Array cho bạn, cách rất thuận tiện để đảo ngược Array của bạn ...


Cũng ở đây để có một cái nhìn: docs.angularjs.org/api/ng/filter/orderBy
Alireza

0

Tôi đã viết phần tiện dụng này để sắp xếp theo nhiều cột / thuộc tính của một đối tượng. Với mỗi lần nhấp cột liên tiếp, mã lưu trữ cột cuối cùng được nhấp và thêm nó vào danh sách ngày càng tăng của các tên chuỗi được nhấp, đặt chúng vào một mảng gọi là sortArray. Bộ lọc "orderBy" Angular tích hợp chỉ cần đọc danh sách sortArray và sắp xếp các cột theo thứ tự các tên cột được lưu trữ ở đó. Vì vậy, tên cột được nhấp cuối cùng trở thành bộ lọc theo thứ tự chính, cái trước được nhấp vào thứ tự ưu tiên, v.v ... Thứ tự ngược lại ảnh hưởng đến tất cả các thứ tự cột cùng một lúc và tăng dần / giảm dần cho bộ danh sách mảng hoàn chỉnh:

<script>
    app.controller('myCtrl', function ($scope) {
        $scope.sortArray = ['name'];
        $scope.sortReverse1 = false;
        $scope.searchProperty1 = '';
        $scope.addSort = function (x) {
            if ($scope.sortArray.indexOf(x) === -1) {
                $scope.sortArray.splice(0,0,x);//add to front
            }
            else {
                $scope.sortArray.splice($scope.sortArray.indexOf(x), 1, x);//remove
                $scope.sortArray.splice(0, 0, x);//add to front again
            }
        };
        $scope.sushi = [
        { name: 'Cali Roll', fish: 'Crab', tastiness: 2 },
        { name: 'Philly', fish: 'Tuna', tastiness: 2 },
        { name: 'Tiger', fish: 'Eel', tastiness: 7 },
        { name: 'Rainbow', fish: 'Variety', tastiness: 6 },
        { name: 'Salmon', fish: 'Misc', tastiness: 2 }
        ];
    });
</script>
<table style="border: 2px solid #000;">
<thead>
    <tr>
        <td><a href="#" ng-click="addSort('name');sortReverse1=!sortReverse1">NAME<span ng-show="sortReverse1==false">&#9660;</span><span ng-show="sortReverse1==true">&#9650;</span></a></td>
        <td><a href="#" ng-click="addSort('fish');sortReverse1=!sortReverse1">FISH<span ng-show="sortReverse1==false">&#9660;</span><span ng-show="sortReverse1==true">&#9650;</span></a></td>
        <td><a href="#" ng-click="addSort('tastiness');sortReverse1=!sortReverse1">TASTINESS<span ng-show="sortReverse1==false">&#9660;</span><span ng-show="sortReverse1==true">&#9650;</span></a></td>
    </tr>
</thead>
<tbody>
    <tr ng-repeat="s in sushi | orderBy:sortArray:sortReverse1 | filter:searchProperty1">
        <td>{{ s.name }}</td>
        <td>{{ s.fish }}</td>
        <td>{{ s.tastiness }}</td>
    </tr>
</tbody>
</table>

0

Tạo ống để phân loại. Chấp nhận cả chuỗi và mảng chuỗi, sắp xếp theo nhiều giá trị. Hoạt động cho Angular (không phải AngularJS). Hỗ trợ cả sắp xếp cho chuỗi và số.

@Pipe({name: 'orderBy'})
export class OrderBy implements PipeTransform {
    transform(array: any[], filter: any): any[] {
        if(typeof filter === 'string') {
            return this.sortAray(array, filter)
        } else {
            for (var i = filter.length -1; i >= 0; i--) {
                array = this.sortAray(array, filter[i]);
            }

            return array;
        }
    }

    private sortAray(array, field) {
        return array.sort((a, b) => {
            if(typeof a[field] !== 'string') {
                a[field] !== b[field] ? a[field] < b[field] ? -1 : 1 : 0
            } else {
                a[field].toLowerCase() !== b[field].toLowerCase() ? a[field].toLowerCase() < b[field].toLowerCase() ? -1 : 1 : 0
            }
        });
    }
}

1
PS: Thật ra theo ý kiến ​​của tôi hiện tại không có ai trả lời cho câu hỏi thực tế, vì nó là dành cho Angular chứ không phải AngularJS. Giải pháp của tôi hoạt động bắt đầu từ Angular 2. Đã thử nghiệm trên Angular 7.2.15
Andris

Bạn nên xem xét a) khi câu hỏi này được hỏi và b) khi nào Angular 2 được công bố lần đầu tiên.
Nick

@andris Bạn có ví dụ mã kết thúc làm việc được lưu trữ ở đâu đó không?
đá lăn

Xin lỗi, nhưng không :(
Andris

-8

Đảm bảo rằng việc sắp xếp không quá phức tạp đối với người dùng cuối. Tôi luôn nghĩ sắp xếp theo nhóm và nhóm phụ là một chút phức tạp để hiểu. Nếu nó là người dùng cuối kỹ thuật thì có thể ổn.


Đây thậm chí không phải là một "bình luận" có liên quan. Để chắc chắn không có câu trả lời cho câu hỏi
Afshin Moazami

Có quá sai không khi tự hỏi liệu cách tiếp cận hiện tại là tốt nhất khi bạn phát triển GUI? Trải nghiệm người dùng cuối cảm thấy phù hợp với tôi
Jens Alenius

Có rất nhiều tình huống trong đó việc sắp xếp theo nhiều thuộc tính giúp người dùng dễ hiểu tổ chức hơn. Về cơ bản, bạn đang nhóm các thứ thành các loại.
Owen Johnson
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.