Angular tidak datang dengan filter orderBy di luar kotak, tetapi jika kita memutuskan kita membutuhkannya, kita dapat dengan mudah membuatnya. Namun ada beberapa peringatan yang perlu kita waspadai terkait dengan kecepatan dan minifikasi. Lihat di bawah.
Pipa sederhana akan terlihat seperti ini.
import { Pipe, PipeTransform } from '@angular/core';
@Pipe({
name: 'sort'
})
export class SortPipe implements PipeTransform {
transform(ary: any, fn: Function = (a,b) => a > b ? 1 : -1): any {
return ary.sort(fn)
}
}
Pipa ini menerima fungsi sortir (fn
), dan memberinya nilai default yang akan mengurutkan array primitif dengan cara yang masuk akal. Kami memiliki opsi untuk mengganti fungsi sortir ini jika diinginkan.
Itu tidak menerima nama atribut sebagai string, karena nama atribut tunduk pada minifikasi. Mereka akan berubah ketika kita mengecilkan kode kita, tetapi penambang tidak cukup pintar untuk juga mengecilkan nilai dalam string template.
Menyortir primitif (angka dan string)
Kita bisa menggunakan ini untuk mengurutkan array angka atau string menggunakan pembanding default:
import { Component } from '@angular/core';
@Component({
selector: 'cat',
template: `
{{numbers | sort}}
{{strings | sort}}
`
})
export class CatComponent
numbers:Array<number> = [1,7,5,6]
stringsArray<string> = ['cats', 'hats', 'caveats']
}
Menyortir larik objek
Jika kita ingin mengurutkan sebuah array objek, kita bisa memberinya fungsi komparator.
import { Component } from '@angular/core';
@Component({
selector: 'cat',
template: `
{{cats | sort:byName}}
`
})
export class CatComponent
cats:Array<Cat> = [
{name: "Missy"},
{name: "Squoodles"},
{name: "Madame Pompadomme"}
]
byName(a,b) {
return a.name > b.name ? 1 : -1
}
}
Peringatan - pipa murni vs. tidak murni
Angular 2 memiliki konsep pipa murni dan tidak murni.
Pipa murni mengoptimalkan deteksi perubahan menggunakan identitas objek. Artinya pipa hanya akan berjalan jika objek input berubah identitas, misalnya jika kita menambahkan item baru ke dalam array. Itu tidak akan turun ke objek. Ini berarti jika kita mengubah atribut bersarang: this.cats[2].name = "Fluffy"
misalnya, pipa tidak akan dijalankan ulang. Ini membantu Angular menjadi cepat. Pipa sudut murni secara default.
Pipa yang tidak murni di sisi lain akan memeriksa atribut objek. Ini berpotensi membuatnya lebih lambat. Karena tidak dapat menjamin apa yang akan dilakukan fungsi pipa (mungkin diurutkan berbeda berdasarkan waktu, misalnya), pipa yang tidak murni akan berjalan setiap kali terjadi peristiwa asinkron.Ini akan sangat memperlambat aplikasi Anda jika arraynya besar.
Pipa di atas murni. Artinya, ini hanya akan berjalan jika objek dalam larik tidak dapat diubah. Jika Anda berganti kucing, Anda harus mengganti seluruh objek kucing dengan yang baru.
this.cats[2] = {name:"Tomy"}
Kita dapat mengubah di atas menjadi pipa tidak murni dengan mengatur atribut murni:
import { Pipe, PipeTransform } from '@angular/core';
@Pipe({
name: 'sort',
pure: false
})
export class SortPipe implements PipeTransform {
transform(ary: any, fn: Function = (a,b) => a > b ? 1 : -1): any {
return ary.sort(fn)
}
}
Pipa ini akan turun menjadi objek, tetapi akan lebih lambat. Gunakan dengan hati-hati.