مرشحات 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"؛ والآن يتطابق النص.

الإخراج:

مرشح الأحرف الصغيرة في 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 على فلتر للأحرف الكبيرة أصلاً - إذ يتطلب تحويل الحرف الأول فقط إلى حرف كبير فلترًا مخصصًا، وهو ما توضحه الأقسام اللاحقة.

الإخراج:

مرشح الأحرف الكبيرة في 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 بينما يحتفظ النطاق بالعدد الكامل.

الإخراج:

تصفية الأرقام في 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:"£"}}.

الإخراج:

تصفية العملة في 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 للعرض.

الإخراج:

مرشح 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"، لكن اسمًا مثل appendTutorial يسهل قراءته ويتجنب التعارض مع اسم مدمج.

الإخراج:

إنشاء مرشح مخصص في 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;
  };
});

ثم يصبح العرض كما يلي، حيث تصبح كلمة "Tutorial" suffix وتصبح الواصلة separator.

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

هناك تفصيلان يسهل إغفالهما. الوسائط عبارة عن تعابير AngularJS، لذا يجب وضع سلسلة نصية حرفية بين علامتي اقتباس، بينما تُقرأ الكلمة غير المقتبسة كخاصية نطاق. كما أن المرشحات تتسلسل، حيث يستقبل كل منها ناتج المرشح السابق. {{tutorial | appendText:"Tutorial" | uppercase}}.

⚠️ : تحذير حافظ على نقاء الفلتر - أي نفس المخرجات لنفس المدخلات، دون أي تغييرات خارجية. يقوم AngularJS بتخزين الفلتر النقي مؤقتًا، ويعيد تشغيله فقط عند تغيير المدخلات. يجب تمييز الفلتر الذي يقرأ الساعة أو يُعدّل خدمةً ما. $stateful، مما يؤدي إلى تعطيل التخزين المؤقت وتشغيل المرشح في كل دورة هضم، وهو سبب شائع لبطء الصفحات.

لا تقتصر المرشحات على القوالب فقط. يمكن استدعاء المرشح نفسه من Javaالنص البرمجي، كما هو موضح أدناه.

كيفية استخدام عوامل التصفية في وحدة تحكم باستخدام خدمة $filter

يُعد تطبيق عامل تصفية في العرض هو الحالة الشائعة، ولكن في بعض الأحيان تكون القيمة المُحوّلة مطلوبة داخل وحدة التحكم، على سبيل المثال قبل إرسال البيانات إلى الخادم. يُتيح 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) بنمط ثابت، و $filter('date')(value, 'yyyy-MM-dd') ينتج ذلك دون المساس بالقيمة المرتبطة بالنموذج. أما الثاني فهو تضييق نطاق المجموعة بمجرد وجودها في وحدة التحكم، بدلاً من تركها orderBy في نانوغرام تكرار تعبير يُعاد تشغيله في كل عملية هضم.

تظل المرشحات التي يتم حقنها بهذه الطريقة مسجلة في الوحدة، لذلك يجب تعريف مرشح مخصص باستخدام app.filter قبل أن يسأل أي متحكم $filter لذلك. وإلا فإن AngularJS سيُظهر خطأً يتعلق بمزود خدمة غير معروف.

استدعاء مرشح في Javaيختلف البرنامج النصي عن القالب في جانب مهم: تُحسب النتيجة مرة واحدة وتُخزن في النطاق بدلاً من إعادة حسابها في كل عملية تجزئة. وهذا ما يجعله الخيار الأسرع لقيمة نادراً ما تتغير، والخيار الخاطئ لقيمة يجب أن تتغير. tracإدخال المستخدم k.

الأسئلة الشائعة

لا، يدعم AngularJS الأحرف الصغيرة والكبيرة فقط. يتطلب تحويل الحرف الأول من كل كلمة إلى حرف كبير استخدام فلتر مخصص يقسم السلسلة النصية ويعيد تركيبها، أو استخدام قاعدة تحويل نص CSS إذا كان التغيير مرئيًا فقط.

تم تسجيل الفلتر في وحدة نمطية مختلفة عن تلك التي تم تشغيلها بواسطة ng-app، أو أن البرنامج النصي الذي يُعرّفه يتم تشغيله قبل تحميل AngularJS. قم بتسجيل الفلتر في نفس الوحدة النمطية وقم بتحميل المكتبة أولاً.

نعم. بايping مجموعة في الداخل نانوغرام تكرار تقوم هذه الدالة بتصفية أو ترتيب العناصر قبل عرضها. تستقبل الدالة المصفوفة بأكملها ويجب أن تُعيد مصفوفة.

نعم. AI يقوم المساعدون بإنشاء المصنع، والدالة المُعادة، وبنية العرض من وصف بسيط لقاعدة التنسيق. تأكد من أن عامل التصفية المُنشأ يحمي من المدخلات غير المُعرّفة.

تقوم أدوات الذكاء الاصطناعي بإعادة كتابة المصنع كفئة تنفذ PipeTransform وتنقل كل معلمة إضافية إلى طريقة التحويل. Revقم بمراجعة أي مرشح ذي حالة $stateful يدويًا، لأنه يجب تعريف الأنابيب غير النقية بشكل صريح.

تلخيص هذه التدوينة بـ: