ตัวกรอง AngularJS และตัวกรองแบบกำหนดเอง AngularJS พร้อมตัวอย่าง

⚡ สรุปอย่างชาญฉลาด

ฟิลเตอร์ใน AngularJS ทำหน้าที่จัดรูปแบบค่าของนิพจน์เพื่อแสดงผลโดยไม่เปลี่ยนแปลงข้อมูลพื้นฐาน ฟิลเตอร์แบบสำเร็จรูปครอบคลุมตัวพิมพ์ใหญ่-เล็ก ตัวเลข สกุลเงิน และ JSON ในขณะที่ฟิลเตอร์แบบกำหนดเองจะจัดการกฎการจัดรูปแบบใดๆ ที่เฟรมเวิร์กไม่ได้จัดเตรียมไว้ให้

  • 🧾 หลักการสำคัญ: ตัวกรองจะเปลี่ยนแปลงเฉพาะสิ่งที่แสดงผลในมุมมองเท่านั้น ค่าที่เก็บไว้ในอ็อบเจ็กต์ขอบเขตจะไม่ถูกแก้ไข
  • ไวยากรณ์ของไปป์: เครื่องหมายขีดแนวตั้งคั่นระหว่างนิพจน์กับชื่อตัวกรอง และเครื่องหมายโคลอนใช้ส่งค่าอาร์กิวเมนต์ไปยังนิพจน์นั้น
  • 🔤 ตัวกรองเคส: การแปลงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่จะแปลงสตริงเพื่อแสดงผล และไม่มีตัวกรองสำหรับการแปลงเป็นตัวพิมพ์ใหญ่ใน AngularJS
  • 🔢 จำนวนและสกุลเงิน: ตัวเลขจำกัดจำนวนทศนิยม ในขณะที่สกุลเงินจะเพิ่มสัญลักษณ์ที่กำหนดโดยภาษาท้องถิ่นไว้ข้างหน้าค่าของตัวเลขนั้น
  • 🛠️ ตัวกรองที่กำหนดเอง: การลงทะเบียนโรงงานที่ส่งคืนฟังก์ชันจะสร้างตัวกรองที่สามารถนำกลับมาใช้ใหม่ได้ทั่วทั้งโมดูล
  • เรื่องความบริสุทธิ์: ตัวกรองจะต้องส่งคืนผลลัพธ์เดียวกันสำหรับอินพุตเดียวกัน เนื่องจาก AngularJS จะแคชผลลัพธ์และข้ามการเรียกใช้ตัวกรองแบบบริสุทธิ์ซ้ำ

ตัวกรองและตัวกรองแบบกำหนดเองของ AngularJS

ตัวกรองใน AngularJS คืออะไร

A กรองใน AngularJS ช่วยในการจัดรูปแบบค่าของนิพจน์สำหรับการแสดงผลต่อผู้ใช้โดยไม่เปลี่ยนแปลงค่าเดิม ตัวอย่างเช่น หากคุณต้องการให้สตริงแสดงเป็นตัวพิมพ์เล็กหรือตัวพิมพ์ใหญ่ คุณสามารถทำได้โดยใช้ตัวกรอง ตัวกรองในตัว เช่น 'lowercase' และ 'uppercase' จะส่งคืนสตริงในรูปแบบที่ต้องการ และยังมีตัวกรองเพิ่มเติมสำหรับตัวเลข สกุลเงิน และ JSON อีกด้วย

⚠️ หมายเหตุเกี่ยวกับเวอร์ชัน: AngularJS (เวอร์ชัน 1.x) สิ้นสุดการสนับสนุนเมื่อวันที่ 31 ธันวาคม 2021 และจะไม่ได้รับการแก้ไขช่องโหว่ด้านความปลอดภัยเพิ่มเติมอีกต่อไป ข้อมูลด้านล่างนี้ยังคงถูกต้องสำหรับการบำรุงรักษาแอปพลิเคชัน AngularJS ที่มีอยู่ ใน Angular เวอร์ชันใหม่ บทบาทเดียวกันนี้จะถูกแทนที่ด้วย pipe

ตัวกรองจะถูกนำไปใช้ในมุมมองที่มีอักขระไปป์ ก่อนที่จะดูแต่ละตัวกรอง ควรทำความเข้าใจก่อนว่าทำไมคุณถึงต้องเขียนตัวกรองของคุณเอง

ตัวกรองตัวพิมพ์เล็กใน AngularJS

ตัวกรองนี้รับสตริงและแสดงอักขระทั้งหมดในสตริงนั้นในรูปแบบตัวพิมพ์เล็ก

ด้านล่างนี้ ตัวควบคุมจะส่งข้อความไปยังส่วนแสดงผลผ่านทางอ็อบเจ็กต์ขอบเขต และตัวกรองจะแปลงข้อความนั้นเป็นตัวพิมพ์เล็ก

ตัวกรองตัวพิมพ์เล็กใน AngularJS

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Event Registration</title>
</head>
<body>
<h1> Guru99 Global Event</h1>
<script src="https://code.angularjs.org/1.6.9/angular.min.js"></script>

<div ng-app="DemoApp" ng-controller="DemoController">
Tutorial Name : <input type="text" ng-model="tutorialName"><br>
This tutorial is {{tutorialName | lowercase}}
</div>

<script>
var app = angular.module('DemoApp', []);

app.controller('DemoController', ['$scope', function($scope) {
  $scope.tutorialName = "Angular JS";
}]);
</script>
</body>
</html>

Code คำอธิบาย

  1. สตริงที่มีทั้งตัวพิมพ์ใหญ่และตัวพิมพ์เล็ก “Angular JS” จะถูกเก็บไว้ในตัวแปรสมาชิกที่ชื่อว่า tutorialName บนวัตถุขอบเขต
  2. สัญลักษณ์ตัวกรอง (|) ทำเครื่องหมายเอาต์พุตสำหรับการแปลง และ lowercase คีย์เวิร์ดนี้ใช้ตัวกรองในตัวที่แปลงสตริงทั้งหมดเป็นตัวพิมพ์เล็ก

⚠️ มีการแก้ไขข้อมูลในทุกรายการแล้ว ตัวอย่างดั้งเดิมทั้งหกชิ้นมีข้อบกพร่องร่วมกันสามประการ chrset="UTF 8" ไม่ใช่แอตทริบิวต์หรือการเข้ารหัสที่ถูกต้อง และตอนนี้ charset="UTF-8". angular-route.js เต็ม ก่อน angular.min.jsซึ่งทำให้เกิดข้อผิดพลาดของโมดูล และไม่เคยถูกใช้งาน — จึงถูกลบออกไปแล้ว เช่นเดียวกับการอ้างอิง jQuery ที่ไม่ได้ใช้ นอกจากนี้ ข้อความยังอ้างว่าค่าคือ “AngularJS” ในขณะที่โค้ดตั้งค่าเป็น “Angular JS” ซึ่งตอนนี้ข้อความตรงกันแล้ว

Output:

ตัวกรองตัวพิมพ์เล็กใน AngularJS

สตริงที่มีตัวพิมพ์ใหญ่และตัวพิมพ์เล็กผสมกันจะถูกแสดงผลเป็นตัวพิมพ์เล็กทั้งหมด การแปลงในทางตรงกันข้ามก็ให้ผลลัพธ์เช่นเดียวกัน

ตัวกรองตัวพิมพ์ใหญ่ใน AngularJS

ตัวกรองนี้เป็นตัวกรองตรงข้ามกับตัวกรองตัวพิมพ์เล็ก โดยจะแสดงตัวอักษรทุกตัวเป็นตัวพิมพ์ใหญ่

ด้านล่างนี้ ตัวควบคุมจะส่งข้อความไปยังส่วนแสดงผลผ่านทางอ็อบเจ็กต์ขอบเขต และตัวกรองจะแปลงข้อความนั้นให้เป็นตัวพิมพ์ใหญ่

ตัวกรองตัวพิมพ์ใหญ่ใน AngularJS

<!-- The head and library references are unchanged from the previous example -->
<div ng-app="DemoApp" ng-controller="DemoController">
Tutorial Name : <input type="text" ng-model="tutorialName"><br>
This tutorial is {{tutorialName | uppercase}}
</div>

<script>
app.controller('DemoController', ['$scope', function($scope) {
  $scope.tutorialName = "Angular JS";
}]);
</script>

Code คำอธิบาย

  1. สตริงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ผสม “Angular JS” ถูกวางไว้ใน tutorialName และแนบไปกับวัตถุขอบเขต
  2. สัญลักษณ์ตัวกรอง (|) ตามด้วย uppercase คำหลักนี้ ทำให้ตัวกรองในตัวแสดงผลสตริงทั้งหมดเป็นตัวพิมพ์ใหญ่

⚠️ การแก้ไข: เดิมทีส่วนนี้ถูกนำเสนอว่าเป็น “ตัวอย่างของตัวกรองการใช้ตัวพิมพ์ใหญ่ใน AngularJS พร้อมตัวเลือกตัวพิมพ์เล็ก” ซึ่งผิดถึงสองครั้ง ส่วนนี้แสดงตัวกรองตัวพิมพ์ใหญ่ และ AngularJS ไม่มีตัวกรองการใช้ตัวพิมพ์ใหญ่เลย การทำให้เฉพาะตัวอักษรตัวแรกเป็นตัวพิมพ์ใหญ่ต้องใช้ตัวกรองแบบกำหนดเอง ซึ่งส่วนต่อๆ ไปจะแสดงวิธีการสร้าง

Output:

ตัวกรองตัวพิมพ์ใหญ่ใน AngularJS

ตัวกรองกรณีไม่รับอาร์กิวเมนต์ใดๆ ตัวกรองถัดไปแสดงวิธีการใช้เครื่องหมายโคลอนเพื่อส่งพารามิเตอร์ไปยังตัวกรอง

ตัวกรองตัวเลขใน AngularJS

ตัวกรองนี้จะจัดรูปแบบตัวเลขและสามารถจำกัดจำนวนทศนิยมที่แสดงได้

ตัวอย่างด้านล่างใช้ตัวกรองตัวเลขเพื่อแสดงค่าที่จำกัดไว้ที่ทศนิยมสองตำแหน่ง ตัวควบคุมจะส่งตัวเลขไปยังมุมมองผ่านอ็อบเจ็กต์ขอบเขต และตัวกรองจะถูกนำไปใช้ในมุมมอง

ตัวกรองตัวเลขใน AngularJS

<!-- The head and library references are unchanged -->
<div ng-app="DemoApp" ng-controller="DemoController">
This tutorialID is {{tutorialID | number:2}}
</div>

<script>
app.controller('DemoController', ['$scope', function($scope) {
  $scope.tutorialID = 3.565656;
}]);
</script>

Code คำอธิบาย

  1. ตัวเลขที่มีทศนิยมหลายตำแหน่งจะถูกเก็บไว้ในตัวแปรสมาชิกที่เรียกว่า tutorialID และแนบไปกับวัตถุขอบเขต
  2. สัญลักษณ์ตัวกรอง (|) ตามด้วย number:2เครื่องหมายโคลอน (:) ใช้ส่งค่าอาร์กิวเมนต์ และเลข 2 ใช้กำหนดทศนิยมสองตำแหน่ง ค่าที่ได้จะถูกปัดเศษเพื่อการแสดงผล ดังนั้น 3.565656 จะปรากฏเป็น 3.57 ในขณะที่ขอบเขตการแสดงผลยังคงแสดงตัวเลขเต็ม

Output:

ตัวกรองตัวเลขใน AngularJS

การจัดรูปแบบตัวเลขธรรมดามักไม่เพียงพอเมื่อค่าดังกล่าวเป็นค่าเงิน ซึ่งเป็นสิ่งที่ตัวกรองถัดไปจะจัดการ

ตัวกรองสกุลเงินใน AngularJS

ตัวกรองนี้จะแปลงตัวเลขให้เป็นค่าสกุลเงิน โดยใส่สัญลักษณ์สกุลเงิน เช่น $ ไว้ข้างหน้า

ในตัวอย่างด้านล่าง ตัวควบคุมจะส่งตัวเลขไปยังมุมมองผ่านอ็อบเจ็กต์ขอบเขต และตัวกรองสกุลเงินจะถูกนำไปใช้ในมุมมองนั้น

ตัวกรองสกุลเงินใน AngularJS

<!-- The head and library references are unchanged -->
<div ng-app="DemoApp" ng-controller="DemoController">
This tutorial Price is {{tutorialprice | currency}}
</div>

<script>
app.controller('DemoController', ['$scope', function($scope) {
  $scope.tutorialprice = 20.56;
}]);
</script>

Code คำอธิบาย

  1. ตัวเลขหนึ่งตัวถูกเก็บไว้ในตัวแปรสมาชิกที่ชื่อว่า tutorialprice และแนบไปกับวัตถุขอบเขต
  2. สัญลักษณ์ตัวกรอง (|) ตามด้วย currency กรอง.

⚠️ การแก้ไข: ข้อความต้นฉบับอ้างว่าสัญลักษณ์สกุลเงิน "ขึ้นอยู่กับการตั้งค่าภาษาที่ใช้ในเครื่อง" ซึ่งไม่เป็นความจริง AngularJS ใช้ภาษาที่มาพร้อมกับไลบรารี ซึ่งโดยค่าเริ่มต้นคือ en-US ดังนั้นสัญลักษณ์จึงเป็น $ ไม่ว่าระบบปฏิบัติการจะเป็นอะไรก็ตาม โหลดไฟล์ที่ตรงกัน angular-locale_*.js ไฟล์ หรือส่งสัญลักษณ์โดยตรง: {{tutorialprice | currency:"£"}}.

Output:

ตัวกรองสกุลเงินใน AngularJS

สตริงและตัวเลขเป็นค่าแบบง่าย ตัวกรองในตัวตัวสุดท้ายจะจัดการกับออบเจ็กต์ทั้งหมด

ตัวกรอง JSON ใน AngularJS

ตัวกรองนี้จะแปลงวัตถุให้เป็นรูปแบบที่กำหนดไว้ JSON สตริง ซึ่งมีประโยชน์สำหรับการตรวจสอบข้อมูลขอบเขตในระหว่างการพัฒนา

ในตัวอย่างด้านล่าง ตัวควบคุมจะส่งอ็อบเจ็กต์ไปยังมุมมองผ่านทางอ็อบเจ็กต์ขอบเขต และตัวกรอง JSON จะถูกนำไปใช้ในมุมมอง

ตัวกรอง JSON ใน AngularJS

<!-- The head and library references are unchanged -->
<div ng-app="DemoApp" ng-controller="DemoController">
This tutorial is {{tutorial | json}}
</div>

<script>
app.controller('DemoController', ['$scope', function($scope) {
  $scope.tutorial = { TutorialID: 12, tutorialName: "Angular" };
}]);
</script>

Code คำอธิบาย

  1. วัตถุที่ถือ TutorialID: 12 และ tutorialName: "Angular" ถูกเก็บไว้ในตัวแปรสมาชิกที่เรียกว่า tutorial และแนบไปกับวัตถุขอบเขต
  2. สัญลักษณ์ตัวกรอง (|) ตามด้วย json ตัวกรองที่แปลงอ็อบเจ็กต์เป็นข้อความ JSON ที่มีการเยื้องย่อหน้า

⚠️ การแก้ไข: เดิมทีระบุค่านี้ว่าเป็น "ตัวเลข" และเป็น "สตริงประเภท JSON" แต่มันไม่ใช่ทั้งสองอย่าง มันคือ... Javaอ็อบเจ็กต์สคริปต์ และตัวกรอง JSON จะแปลงอ็อบเจ็กต์นั้นให้เป็นสตริง JSON เพื่อแสดงผล

Output:

ตัวกรอง JSON ใน AngularJS

ตัวกรองทั้งห้าตัวนี้ครอบคลุมกรณีทั่วไปแล้ว หากไม่มีตัวใดให้ผลลัพธ์ที่คุณต้องการ คุณก็ต้องเขียนตัวกรองของคุณเอง

ตัวกรองแบบกำหนดเอง AngularJS

บางครั้งฟิลเตอร์สำเร็จรูปใน AngularJS อาจไม่ตรงตามความต้องการในการจัดรูปแบบผลลัพธ์ ในกรณีเช่นนี้ สามารถสร้างฟิลเตอร์แบบกำหนดเองใน AngularJS เพื่อส่งคืนผลลัพธ์ในรูปแบบที่ต้องการได้

ตัวกรองแบบกำหนดเองจะถูกลงทะเบียนในโมดูล จากนั้นจะทำงานเหมือนกับตัวกรองมาตรฐานทุกประการ ส่วนด้านล่างจะกล่าวถึงตัวกรองมาตรฐานก่อน เนื่องจากตัวกรองแบบกำหนดเองใช้ไวยากรณ์ของไปป์แบบเดียวกัน จากนั้นจึงแสดงวิธีการสร้างตัวกรองแบบกำหนดเอง

วิธีสร้างตัวกรองแบบกำหนดเองใน AngularJS

ในตัวอย่างด้านล่าง สตริงจะถูกส่งผ่านจาก ตัวควบคุม ไปยังมุมมองผ่านออบเจ็กต์ขอบเขต แต่ไม่ควรแสดงผลตามนั้น ตัวกรองแบบกำหนดเองใน AngularJS เพิ่มข้อความอีกชุดหนึ่งและแสดงผลลัพธ์ที่เสร็จสมบูรณ์

สร้างตัวกรองแบบกำหนดเองใน AngularJS

<!-- The head and library references are unchanged -->
<div ng-app="DemoApp" ng-controller="DemoController">
This tutorial is {{tutorial | Demofilter}}
</div>

<script>
var app = angular.module('DemoApp', []);

// The factory runs once; the function it returns runs on every value
app.filter('Demofilter', function() {
  return function(input) {
    return input + " Tutorial";
  };
});

app.controller('DemoController', ['$scope', function($scope) {
  $scope.tutorial = "Angular";
}]);
</script>

Code คำอธิบาย

  1. สตริง “Angular” ถูกเก็บไว้ในตัวแปรสมาชิกที่ชื่อว่า tutorial และแนบไปกับวัตถุขอบเขต
  2. AngularJS มีคุณสมบัติดังนี้ filter วิธีการลงทะเบียนที่ใช้ในการสร้างตัวกรองแบบกำหนดเอง ชื่อที่ตั้งให้กับตัวกรองนี้คือ 'Demofilter' และชื่อนี้คือชื่อที่หน้าจอแสดงผลอ้างอิงถึง
  3. นี่คือรูปแบบมาตรฐานของตัวกรองแบบกำหนดเอง: ฟังก์ชันที่ลงทะเบียนไว้คือ โรงงาน โดยจะส่งคืนฟังก์ชันที่ทำหน้าที่นั้น ฟังก์ชันดังกล่าวจะรับค่าที่ต้องการกรองเป็นพารามิเตอร์ตัวแรก และส่งคืนผลลัพธ์ ซึ่งในที่นี้คือค่าที่ป้อนเข้าไปพร้อมกับคำว่า "Tutorial" ที่ต่อท้าย
  4. ตัวกรองจะถูกนำไปใช้ในมุมมองโดยใช้ไวยากรณ์ของท่อแบบเดียวกับตัวกรองในตัวอื่นๆ

💡 เคล็ดลับ: โดยทั่วไปแล้ว ชื่อฟิลเตอร์จะใช้ตัวพิมพ์เล็กหรือ camelCase เช่น 'Demofilter' ก็ใช้ได้ แต่ชื่ออย่างเช่น 'Demofilter' อาจไม่เหมาะสมนัก appendTutorial อ่านง่ายกว่าและหลีกเลี่ยงการซ้ำซ้อนกับชื่อที่มีอยู่แล้ว

Output:

สร้างตัวกรองแบบกำหนดเองใน AngularJS

คำว่า 'Tutorial' ถูกเพิ่มต่อท้ายสตริงที่ส่งเข้ามา tutorial ตัวแปร ตัวกรองนี้จะเพิ่มข้อความเดิมซ้ำๆ เสมอ ซึ่งในส่วนถัดไปจะทำให้สามารถกำหนดค่าได้

วิธีการส่งอาร์กิวเมนต์ไปยังตัวกรองแบบกำหนดเอง

ตัวกรองด้านบนกำหนดข้อความที่จะเพิ่มเข้าไปแบบตายตัว ดังนั้นจึงทำได้เพียงอย่างเดียว ตัวกรองในตัวเช่น number:2 ยอมรับอาร์กิวเมนต์หลังเครื่องหมายโคลอน และตัวกรองแบบกำหนดเองก็ทำได้เช่นกัน: พารามิเตอร์ทุกตัวหลังตัวแรกจะถูกแมปไปยังอาร์กิวเมนต์ที่คั่นด้วยเครื่องหมายโคลอนในมุมมอง

มีสามขั้นตอนดังนี้: เพิ่มพารามิเตอร์หลังจากนั้น input ในฟังก์ชันที่ส่งคืน ให้ระบุค่าเริ่มต้นสำหรับสิ่งที่เป็นตัวเลือก เพื่อให้ตัวกรองยังคงทำงานได้แม้ว่าจะละเว้นอาร์กิวเมนต์ จากนั้นส่งอาร์กิวเมนต์ในวิวโดยคั่นด้วยเครื่องหมายโคลอน

app.filter('appendText', function() {
  return function(input, suffix, separator) {
    if (!input) { return input; }        // guard against undefined
    separator = typeof separator === 'undefined' ? ' ' : separator;
    return input + separator + suffix;
  };
});

จากนั้นหน้าจอแสดงผลจะเป็นดังนี้ โดยที่ “บทเรียน” จะกลายเป็น suffix และเครื่องหมายยัติภังค์กลายเป็น separator.

{{tutorial | appendText:"Tutorial"}}          // Angular Tutorial
{{tutorial | appendText:"Tutorial":" - "}}    // Angular - Tutorial

มีรายละเอียดสองอย่างที่อาจมองข้ามได้ง่าย อาร์กิวเมนต์เป็นนิพจน์ของ AngularJS ดังนั้นสตริงตัวอักษรจะต้องอยู่ในเครื่องหมายคำพูด ในขณะที่คำที่ไม่อยู่ในเครื่องหมายคำพูดจะถูกอ่านเป็นคุณสมบัติของขอบเขต นอกจากนี้ ฟิลเตอร์ยังทำงานแบบต่อเนื่อง โดยแต่ละฟิลเตอร์จะรับเอาผลลัพธ์จากฟิลเตอร์ก่อนหน้า: {{tutorial | appendText:"Tutorial" | uppercase}}.

⚠️ คำเตือน: รักษาตัวกรองให้บริสุทธิ์ — ให้ผลลัพธ์เหมือนเดิมสำหรับอินพุตเดิม โดยไม่มีการเปลี่ยนแปลงจากภายนอก AngularJS จะแคชตัวกรองที่บริสุทธิ์และเรียกใช้งานอีกครั้งก็ต่อเมื่ออินพุตเปลี่ยนแปลงเท่านั้น ตัวกรองที่อ่านเวลาหรือเปลี่ยนแปลงบริการจะต้องถูกทำเครื่องหมายไว้ $statefulซึ่งจะปิดใช้งานการแคชและเรียกใช้ตัวกรองในทุกรอบการประมวลผล ซึ่งเป็นสาเหตุทั่วไปที่ทำให้หน้าเว็บโหลดช้า

ตัวกรองไม่ได้จำกัดอยู่เฉพาะในเทมเพลตเท่านั้น สามารถเรียกใช้ตัวกรองเดียวกันได้จากหลายแหล่ง Javaสคริปต์แสดงดังต่อไปนี้

วิธีใช้งานฟิลเตอร์ในคอนโทรลเลอร์ด้วยบริการ $filter

การใช้ฟิลเตอร์ในมุมมอง (view) เป็นกรณีทั่วไป แต่บางครั้งค่าที่แปลงแล้วอาจจำเป็นต้องใช้ภายในคอนโทรลเลอร์ (controller) เช่น ก่อนส่งข้อมูลไปยังเซิร์ฟเวอร์ AngularJS เปิดเผยฟิลเตอร์ที่ลงทะเบียนไว้ทั้งหมด ทั้งฟิลเตอร์ในตัวและฟิลเตอร์ที่กำหนดเอง ผ่านทาง $filter เรียกใช้บริการโดยการฉีดเข้าไป จากนั้นเรียกใช้ด้วยชื่อตัวกรองเพื่อดึงฟังก์ชันตัวกรอง แล้วเรียกใช้ฟังก์ชันนั้นด้วยค่าและอาร์กิวเมนต์ใดๆ

app.controller('DemoController', ['$scope', '$filter',
function($scope, $filter) {
  $scope.tutorial = "Angular";

  // Built-in filters, called from JavaScript
  $scope.shouted = $filter('uppercase')($scope.tutorial);      // "ANGULAR"
  $scope.price   = $filter('currency')(20.56);                 // "$20.56"

  // A custom filter works exactly the same way
  $scope.full    = $filter('appendText')($scope.tutorial, "Tutorial");
}]);

นอกจากนี้ยังมีรูปแบบที่สั้นกว่าด้วย นั่นคือการแทรกชื่อตัวกรองตามด้วย Filterเช่น uppercaseFilterโดยจะให้ฟังก์ชันการกรองโดยตรงและสามารถเรียกใช้งานได้ทันที ทั้งสองรูปแบบให้ผลลัพธ์เป็นฟังก์ชันเดียวกัน ดังนั้นการเลือกใช้จึงขึ้นอยู่กับสไตล์การใช้งาน

มีการใช้งานสองอย่างที่พบเจอซ้ำๆ อย่างแรกคือการเตรียมข้อมูลที่จะส่งไปยัง API: โดยปกติแล้วข้อมูลจะต้องถูกส่งไปยัง API ในรูปแบบที่กำหนดไว้ และ $filter('date')(value, 'yyyy-MM-dd') วิธีแรกคือการกรองข้อมูลโดยไม่แตะต้องค่าที่ผูกกับฟอร์ม วิธีที่สองคือการจำกัดขอบเขตของคอลเลกชันเพียงครั้งเดียวในคอนโทรลเลอร์ แทนที่จะปล่อยทิ้งไว้ orderBy ใน ng-ซ้ำ นิพจน์ที่แสดงการทำงานซ้ำในทุกรอบการวิเคราะห์

ฟิลเตอร์ที่ถูกแทรกด้วยวิธีนี้จะยังคงถูกลงทะเบียนในโมดูล ดังนั้นฟิลเตอร์แบบกำหนดเองจะต้องถูกประกาศด้วย app.filter ก่อนที่ตัวควบคุมใดๆ จะถาม $filter สำหรับกรณีนี้ มิเช่นนั้น AngularJS จะแสดงข้อผิดพลาดว่าผู้ให้บริการไม่รู้จัก

การเรียกใช้ฟิลเตอร์ใน Javaสคริปต์แตกต่างจากเทมเพลตในประเด็นสำคัญประการหนึ่ง คือ ผลลัพธ์จะถูกคำนวณเพียงครั้งเดียวและจัดเก็บไว้ในขอบเขต แทนที่จะคำนวณใหม่ทุกครั้งที่มีการสร้างไดเจสต์ ทำให้เป็นตัวเลือกที่เร็วกว่าสำหรับค่าที่เปลี่ยนแปลงไม่บ่อยนัก และเป็นตัวเลือกที่ไม่เหมาะสมสำหรับค่าที่ต้องเปลี่ยนแปลงบ่อยครั้ง track ข้อมูลที่ผู้ใช้ป้อน

คำถามที่พบบ่อย

ไม่ AngularJS รองรับเฉพาะตัวพิมพ์เล็กและตัวพิมพ์ใหญ่เท่านั้น การเปลี่ยนตัวอักษรตัวแรกของแต่ละคำให้เป็นตัวพิมพ์ใหญ่ต้องใช้ฟิลเตอร์แบบกำหนดเองที่แยกสตริงและสร้างใหม่ หรือใช้กฎ CSS text-transform หากการเปลี่ยนแปลงนั้นเป็นเพียงการเปลี่ยนแปลงด้านภาพเท่านั้น

ตัวกรองถูกลงทะเบียนในโมดูลที่แตกต่างจากโมดูลที่ ng-app สร้างขึ้น หรือสคริปต์ที่กำหนดตัวกรองนั้นทำงานก่อนที่ AngularJS จะโหลด ควรลงทะเบียนตัวกรองในโมดูลเดียวกันและโหลดไลบรารีนั้นก่อน

ใช่. พายping คอลเลกชันภายใน ng-ซ้ำ ตัวกรองจะทำการกรองหรือจัดลำดับรายการก่อนที่จะแสดงผล ตัวกรองจะรับอาร์เรย์ทั้งหมดและต้องส่งคืนอาร์เรย์เช่นกัน

ใช่. AI ผู้ช่วยจะสร้างโรงงาน ฟังก์ชันที่ส่งคืน และไวยากรณ์การแสดงผลจากคำอธิบายกฎการจัดรูปแบบแบบธรรมดา ตรวจสอบให้แน่ใจว่าตัวกรองที่สร้างขึ้นป้องกันอินพุตที่ไม่กำหนดค่าไว้

เครื่องมือ AI จะเขียนโค้ดโรงงานใหม่เป็นคลาสที่ใช้งานอินเทอร์เฟซ PipeTransform และย้ายพารามิเตอร์เพิ่มเติมแต่ละตัวเข้าไปในเมธอด transform Revตรวจสอบตัวกรอง $stateful ใดๆ ด้วยตนเอง เนื่องจากต้องประกาศไปป์ที่ไม่บริสุทธิ์อย่างชัดเจน

สรุปโพสต์นี้ด้วย: