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)
}
}
ไปป์นี้ยอมรับฟังก์ชั่น sort ( fn
) และให้เป็นค่าเริ่มต้นที่จะจัดเรียงอาร์เรย์ของ primitives ด้วยวิธีที่สมเหตุสมผล เรามีตัวเลือกในการแทนที่ฟังก์ชันการเรียงลำดับนี้หากต้องการ
ไม่ยอมรับชื่อแอตทริบิวต์เป็นสตริงเนื่องจากชื่อแอตทริบิวต์อาจมีการลดขนาด ค่าเหล่านี้จะเปลี่ยนไปเมื่อเราย่อขนาดโค้ดของเรา แต่ตัวย่อไม่ฉลาดพอที่จะย่อค่าในสตริงเทมเพลต
การเรียงลำดับดั้งเดิม (ตัวเลขและสตริง)
เราสามารถใช้สิ่งนี้เพื่อจัดเรียงอาร์เรย์ของตัวเลขหรือสตริงโดยใช้ตัวเปรียบเทียบเริ่มต้น:
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 เป็นไปอย่างรวดเร็ว ท่อเชิงมุมจะบริสุทธิ์โดยปริยาย
ในทางกลับกันท่อที่ไม่บริสุทธิ์จะตรวจสอบคุณสมบัติของวัตถุ ซึ่งอาจทำให้ช้าลงมาก เนื่องจากไม่สามารถรับประกันได้ว่าฟังก์ชันไพพ์จะทำอะไร (อาจเรียงลำดับแตกต่างกันไปตามช่วงเวลาของวันเป็นต้น) ไปป์ที่ไม่บริสุทธิ์จะทำงานทุกครั้งที่เกิดเหตุการณ์แบบอะซิงโครนัส สิ่งนี้จะทำให้แอปของคุณช้าลงอย่างมากหากอาร์เรย์มีขนาดใหญ่
ท่อข้างบนล้วนๆ ซึ่งหมายความว่ามันจะทำงานก็ต่อเมื่อวัตถุในอาร์เรย์ไม่เปลี่ยนรูป หากคุณเปลี่ยนแมวคุณต้องแทนที่วัตถุ cat ทั้งหมดด้วยวัตถุใหม่
this.cats[2] = {name:"Tomy"}
เราสามารถเปลี่ยนข้างต้นเป็นท่อที่ไม่บริสุทธิ์โดยตั้งค่าแอตทริบิวต์บริสุทธิ์:
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)
}
}
ท่อนี้จะไหลลงสู่วัตถุ แต่จะช้ากว่า ใช้ด้วยความระมัดระวัง