Angular'daki birden çok alan tarafından


382

Açısal olarak aynı anda birden çok alan kullanarak sıralama nasıl yapılır? gruba göre ve sonra Örnek için alt gruba göre yumruk

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

Bunu şu şekilde göstermek istedim:

grup: Alt grup

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'" />

Yanıtlar:


659

Lütfen şuna bakın:

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

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

137
orderBy:['-group','sub']groupters sırayla sıralama için.
Dmitriy

1
Grup alanının orderBy Listesinde birinci olma önceliği var mı?
luchosrock

5
@ lucucrock, evet, beklendiği gibi. Sağlanan jsfiddle ile oynamak, sıralama önceliğinin sağlanan sıralama alanları için soldan sağa olduğunu doğrular.
Patrick Refondini

2
İsteğe bağlı reverseOrder parametresinin, ifade parametresinin yaptığı gibi bir diziyi desteklemediğini, ancak bunu atlayabilir ve bunun yerine her bir dizi öğesinde ayrı ayrı tersine (veya değil) sıralama düzeni sağlayabileceğinizi unutmayın. Örnek: orderBy: ['grup', '-sub'], gruba göre normal şekilde, daha sonra alt sırayla tersine sıralar. Bu şekilde bazı karmaşık kombinasyonlar elde etmek mümkündür.
Daniel Nalbach

1
Dizi öğelerine bir boole özelliği vererek ve ardından bunu ilk seçenek olarak kullanarak mağazamızda önceliği simüle ettik. Örnek: orderBy: ['-featured', 'title']; özellikli gerçek öğelerin en üstte olmasına (alfabetik olarak), ardından geri kalan öğelerin alfabetik olarak listelenmesine neden oldu.
Daniel Nalbach


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

Birden çok sipariş yerine kullanıcı dizisi


5

Sıralama açısal olarak 'orderBy' filtresi kullanılarak yapılabilir.

İki yolla: 1. Görünümden 2. Denetleyiciden

  1. Görünümden

Sözdizimi:

{{array | orderBy : expression : reverse}} 

Örneğin:

 <div ng-repeat="user in users | orderBy : ['name', 'age'] : true">{{user.name}}</div>
  1. Denetleyiciden

Sözdizimi:

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

Örneğin:

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

5

AngularJs filtreleri yapmanın 2 yolu vardır; bunlardan biri {{}} kullanarak HTML'de, diğeri de gerçek JS dosyalarında ...

Kullanarak sorunu çözebilir:

{{ Expression | orderBy : expression : reverse}}

HTML'de kullanırsanız veya aşağıdaki gibi bir şey kullanırsanız:

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

Tersi sonunda isteğe bağlıdır, bir boole kabul eder ve doğruysa, Diziyi sizin için tersine çevirir, Dizinizi tersine çevirmek için çok kullanışlı bir yol ...


Ayrıca bir göz atmak için: docs.angularjs.org/api/ng/filter/orderBy
Alireza

0

Bir nesnenin birden çok sütununa / özelliklerine göre sıralamak için bu kullanışlı parçayı yazdım. Art arda gelen her sütun tıklamasında kod, tıklatılan son sütunu depolar ve onu, artan bir tıklanan sütun dizesi adı listesine ekleyerek sortArray adlı bir diziye yerleştirir. Yerleşik Açısal "orderBy" filtresi sortArray listesini okur ve sütunları burada saklanan sütun adlarının sırasına göre sıralar. Böylece, son tıklanan sütun adı birincil sıralı filtre haline gelir, öncekini öncekinde öncekini tıklar vb. Ters sıra tüm sütun sırasını bir kerede etkiler ve tüm dizi listesi kümesi için artan / azalanları değiştirir:

<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

Sıralama için Boru oluşturuldu. Birden çok değere göre sıralama yaparak dize ve dize dizilerini kabul eder. Açısal için çalışır (Açısal JS değil). Dize ve sayılar için sıralamayı destekler.

@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: Aslında bana göre şu anda hiç kimse gerçek soruya cevap vermedi, çünkü AngularJS için değil Angular içindi. Çözümüm Açısal 2'den başlayarak çalışıyor. Açısal 7.2.15
Andris

A) bu soru ne zaman soruldu ve b) Açısal 2 ilk ne zaman açıklandı?
Nick

@andris Bir yerde barındırılan bir uçtan uca kod örneği var mı?
yuvarlanan taş

Üzgünüz, ama hayır :(
Andris

-8

Sıralamanın son kullanıcı için karmaşık olmadığından emin olun. Her zaman grup ve alt grupta sınıflandırmanın anlaşılması biraz karmaşık olduğunu düşündüm. Eğer teknik bir son kullanıcı ise sorun olabilir.


Bu bile alakalı bir "yorum" değildir. Kesinlikle soruya bir cevap değil
Afshin Moazami

GUI geliştirme yaparken mevcut yaklaşımın en iyisi olup olmadığını kendinize sormak çok mu yanlış? Son kullanıcı deneyimi benimle alakalı hissediyor
Jens Alenius

Birden çok özelliğe göre sıralamanın kullanıcının kuruluşu anlamasını kolaylaştıracağı birçok senaryo vardır. Temelde işleri kategorilere ayırıyorsunuz.
Owen Johnson
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.