Angular не постачається із замовленням, відфільтрувавши з коробки, але якщо ми вирішимо, що нам потрібен, ми можемо легко його зробити. Однак є деякі застереження, про які нам слід пам’ятати, пов’язані зі швидкістю та мінімізацією. Дивись нижче.
Проста труба виглядала б приблизно так.
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)
}
}
Ця труба приймає функцію сортування ( fn
) і надає їй значення за замовчуванням, яке розумно відсортує масив примітивів. За бажанням ми маємо можливість замінити цю функцію сортування.
Він не приймає ім'я атрибута як рядок, оскільки імена атрибутів підлягають мініфікації. Вони зміняться, коли ми зменшимо наш код, але мініфайлери недостатньо розумні, щоб також зменшити значення в рядку шаблону.
Сортування примітивів (цифр і рядків)
Ми могли б використовувати це для сортування масиву чисел або рядків, використовуючи порівняльник за замовчуванням:
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']
}
Сортування масиву об’єктів
Якщо ми хочемо відсортувати масив об’єктів, ми можемо надати йому функцію порівняння.
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
}
}
Застереження - чисті проти нечистих труб
Angular 2 має концепцію чистої та нечистої труби.
Чистий канал оптимізує виявлення змін за допомогою ідентифікації об’єкта. Це означає, що конвеєр буде працювати, лише якщо вхідний об'єкт змінює ідентичність, наприклад, якщо ми додаємо новий елемент до масиву. Він не буде спускатися на предмети. Це означає, що якщо ми змінимо вкладений атрибут: this.cats[2].name = "Fluffy"
наприклад, конвеєр не повториться. Це допомагає Angular бути швидким. Кутові труби за замовчуванням чисті.
Натомість нечиста труба перевірятиме атрибути об’єкта. Це потенційно робить його набагато повільнішим. Оскільки він не може гарантувати, що буде виконувати функція конвеєра (можливо, він сортується по-різному, залежно від часу доби), нечистий конвеєр буде запускатися кожного разу, коли відбувається асинхронна подія. Це значно уповільнить вашу програму, якщо масив великий.
Труба вгорі чиста. Це означає, що він буде працювати лише тоді, коли об'єкти в масиві незмінні. Якщо ви міняєте кота, ви повинні замінити весь котячий об’єкт новим.
this.cats[2] = {name:"Tomy"}
Ми можемо змінити вищезазначене на нечисту трубу, встановивши атрибут pure:
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)
}
}
Ця труба опуститься в об'єкти, але буде повільнішою. Використовуйте обережно.