Saya memiliki satu set ubin yang menampilkan angka tertentu tergantung pada opsi mana yang dipilih oleh pengguna. Sekarang saya ingin menerapkan pengurutan berdasarkan nomor apa pun yang ditampilkan.
Kode di bawah ini menunjukkan bagaimana saya menerapkannya (dengan mendapatkan / menetapkan nilai dalam cakupan kartu induk). Sekarang, karena fungsi orderBy mengambil string, saya mencoba menetapkan variabel dalam cakupan kartu yang disebut curOptionValue dan mengurutkan berdasarkan itu, tetapi tampaknya tidak berhasil.
Jadi pertanyaannya menjadi, bagaimana cara membuat fungsi sortir kustom?
<div ng-controller="aggViewport" >
<div class="btn-group" >
<button ng-click="setOption(opt.name)" ng-repeat="opt in optList" class="btn active">{{opt.name}}</button>
</div>
<div id="container" iso-grid width="500px" height="500px">
<div ng-repeat="card in cards" class="item {{card.class}}" ng-controller="aggCardController">
<table width="100%">
<tr>
<td align="center">
<h4>{{card.name}}</h4>
</td>
</tr>
<tr>
<td align="center"><h2>{{getOption()}}</h2></td>
</tr>
</table>
</div>
</div>
dan pengontrol:
module.controller('aggViewport',['$scope','$location',function($scope,$location) {
$scope.cards = [
{name: card1, values: {opt1: 9, opt2: 10}},
{name: card1, values: {opt1: 9, opt2: 10}}
];
$scope.option = "opt1";
$scope.setOption = function(val){
$scope.option = val;
}
}]);
module.controller('aggCardController',['$scope',function($scope){
$scope.getOption = function(){
return $scope.card.values[$scope.option];
}
}]);
Solusi yang diterima hanya berfungsi pada array, tetapi tidak pada objek atau array asosiatif. Sayangnya, karena Angular bergantung pada implementasi JavaScript dari enumerasi array, urutan properti objek tidak dapat dikontrol secara konsisten. Beberapa browser mungkin melakukan iterasi melalui properti objek secara leksikografis, tetapi ini tidak dapat dijamin.
misalnya Diberikan tugas berikut:
dan perintahnya
<ul ng-repeat="(key, card) in cards | orderBy:myValueFunction">
, ng-repeat dapat mengulang "card1" sebelum "card2", apa pun urutannya.Untuk mengatasinya, kita bisa membuat filter kustom untuk mengonversi objek menjadi array, lalu menerapkan fungsi sortir kustom sebelum mengembalikan koleksi.
Kita tidak dapat mengulang pasangan (key, value) bersama dengan filter kustom (karena kunci untuk array adalah indeks numerik), jadi template harus diperbarui untuk mereferensikan nama kunci yang dimasukkan.
Berikut ini biola yang berfungsi menggunakan filter khusus pada array asosiatif: http://jsfiddle.net/av1mLpqx/1/
Referensi: https://github.com/angular/angular.js/issues/1286#issuecomment-22193332
sumber
Tautan berikut menjelaskan filter di Angular dengan sangat baik. Ini menunjukkan bagaimana mungkin untuk mendefinisikan logika sortir kustom dalam ng-repeat. http://toddmotto.com/everything-about-custom-filters-in-angular-js
Untuk mengurutkan objek dengan properti, ini adalah kode yang saya gunakan: (Perhatikan bahwa pengurutan ini adalah metode pengurutan JavaScript standar dan tidak khusus untuk sudut) Nama Kolom adalah nama properti tempat pengurutan akan dilakukan.
sumber
Untuk memasukkan arah bersama dengan fungsi orderBy:
dimana
sumber
myOrderbyFunction()
sebagai gantinya Anda harus menulismyOrderbyFunction
tanpa()
, itu akan dipanggil untuk setiap dua pasang elemen agar Anda memberikan penyortiran kustom.