إضافة خاصية الترشيح لتطبيق Angular وتجهيزه للنشر: دليل شامل وموسع
تُعدّ خاصية الترشيح (Filtering) من الوظائف الحيوية التي تُضفي على تطبيقات الويب طابعاً من السلاسة، التنظيم، وسهولة الاستخدام، خصوصاً في تطبيقات Angular التي تعتمد على مكونات متكاملة لتقديم تجربة مستخدم ديناميكية وسريعة. في هذا المقال، سيتم استعراض كافة الخطوات العملية والتقنية لإضافة ميزة الترشيح إلى تطبيق Angular باستخدام أفضل الممارسات، مع التركيز على قابلية التوسع، الأداء، وتجربة المستخدم. وسيتبع ذلك تفصيل كامل لعملية تجهيز التطبيق للنشر، مع شرح إعدادات الإنتاج وتحسين أداء الحزمة النهائية.
مقدمة حول Angular وميّزة الترشيح
Angular هو إطار عمل لتطبيقات الويب مطوّر بلغة TypeScript، ويعتمد على مفهوم المكونات (Components) والخدمات (Services) لإنشاء تطبيقات قوية على مستوى المؤسسة. واحدة من أهم مزايا Angular هي القدرة على إنشاء تطبيقات تفاعلية عالية الأداء، وخاصية الترشيح تُعتبر ضرورية لتسهيل عملية البحث ضمن البيانات أو تنظيمها بناءً على معايير معيّنة.
أهمية خاصية الترشيح في تطبيقات Angular
تتجلّى أهمية الترشيح في عدّة جوانب أهمها:
-
تحسين تجربة المستخدم: يمكن للمستخدمين الوصول إلى المعلومات التي يحتاجونها بشكل أسرع.
-
تقليل الحمل على واجهة المستخدم: بدلاً من عرض كميات كبيرة من البيانات دفعة واحدة، يتم عرض البيانات ذات الصلة فقط.
-
زيادة سرعة الأداء في التفاعل مع البيانات: خصوصاً في التطبيقات التي تحتوي على جداول أو قوائم ضخمة.
إعداد بيئة العمل في Angular
لبدء العمل يجب التأكد من إعداد بيئة تطوير Angular بشكل صحيح. يتطلب ذلك وجود:
-
Node.js (الإصدار الموصى به)
-
Angular CLI
-
محرر كود مثل Visual Studio Code
تثبيت Angular CLI:
bashnpm install -g @angular/cli
إنشاء مشروع جديد:
bashng new filtroApp
cd filtroApp
إعداد نموذج بيانات بسيط للترشيح
نفترض وجود نموذج بيانات يمثل قائمة منتجات. سيتم إنشاء ملف بيانات مبدئي:
src/app/data/products.ts
typescriptexport const PRODUCTS = [
{ id: 1, name: 'حاسوب محمول', category: 'إلكترونيات' },
{ id: 2, name: 'هاتف ذكي', category: 'إلكترونيات' },
{ id: 3, name: 'كتاب تاريخ', category: 'كتب' },
{ id: 4, name: 'كرسي مكتبي', category: 'أثاث' },
{ id: 5, name: 'سماعات بلوتوث', category: 'إلكترونيات' },
];
إنشاء مكون عرض المنتجات
إنشاء المكون:
bashng generate component product-list
إعداد الكود في product-list.component.ts:
typescriptimport { Component } from '@angular/core';
import { PRODUCTS } from '../data/products';
@Component({
selector: 'app-product-list',
templateUrl: './product-list.component.html',
})
export class ProductListComponent {
products = PRODUCTS;
filterText = '';
get filteredProducts() {
if (!this.filterText) {
return this.products;
}
const lowerCaseFilter = this.filterText.toLowerCase();
return this.products.filter(product =>
product.name.toLowerCase().includes(lowerCaseFilter) ||
product.category.toLowerCase().includes(lowerCaseFilter)
);
}
}
تصميم واجهة الترشيح
product-list.component.html
html<div class="container">
<input type="text" [(ngModel)]="filterText" placeholder="ابحث عن منتج..." />
<ul>
<li *ngFor="let product of filteredProducts">
{{ product.name }} - <strong>{{ product.category }}strong>
li>
ul>
div>
تمكين FormsModule
افتح ملف app.module.ts وتأكد من استيراد FormsModule:
typescriptimport { FormsModule } from '@angular/forms';
@NgModule({
declarations: [AppComponent, ProductListComponent],
imports: [BrowserModule, FormsModule],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule { }
تحسين الترشيح بإضافة Pipe مخصص
يمكن إنشاء Pipe مخصص لجعل عملية الترشيح أكثر مرونة وقابلة لإعادة الاستخدام:
bashng generate pipe productFilter
product-filter.pipe.ts
typescriptimport { Pipe, PipeTransform } from '@angular/core';
@Pipe({
name: 'productFilter'
})
export class ProductFilterPipe implements PipeTransform {
transform(items: any[], searchText: string): any[] {
if (!items || !searchText) {
return items;
}
const text = searchText.toLowerCase();
return items.filter(item =>
item.name.toLowerCase().includes(text) || item.category.toLowerCase().includes(text)
);
}
}
التعديل في HTML:
html<input type="text" [(ngModel)]="filterText" placeholder="ابحث عن منتج..." />
<ul>
<li *ngFor="let product of products | productFilter:filterText">
{{ product.name }} - <strong>{{ product.category }}strong>
li>
ul>
دعم الترشيح حسب أكثر من معيار
يمكن التوسّع في الترشيح ليشمل أكثر من حقل مثل السعر أو العلامة التجارية بإضافة عناصر جديدة في نموذج البيانات وتحديث دالة الترشيح لتأخذ هذه المعايير في الاعتبار.
جدول مقارنة: استخدام الترشيح داخل Component مقابل Pipe
| العنصر | الترشيح داخل Component | الترشيح باستخدام Pipe مخصص |
|---|---|---|
| القابلية لإعادة الاستخدام | منخفضة | عالية |
| قابلية الاختبار | متوسطة | عالية |
| قابلية القراءة والصيانة | منخفضة مع تعقيد الكود | مرتفعة |
| الأداء في التطبيقات الكبيرة | أفضل | أبطأ نسبيًا |
تحسين الأداء في الترشيح
-
استخدام
trackByمعngForلتقليل عمليات إعادة الرسم. -
دمج Angular CDK Virtual Scroll في حالة التعامل مع قوائم ضخمة.
-
تخزين النتائج المفلترة مؤقتاً عند الحاجة لمنع إعادة الحسابات المكلفة.
تجهيز التطبيق للنشر
بعد الانتهاء من تطوير التطبيق وإضافة خاصية الترشيح، تأتي مرحلة التحزيم والنشر، والتي يجب أن تتم باستخدام إعدادات الإنتاج للحصول على حزمة خفيفة وسريعة.
بناء التطبيق للإنتاج:
bashng build --configuration production
الميزات في هذا الوضع:
-
تقليص حجم الحزمة (Minification)
-
إزالة تعليمات التصحيح
-
تحسين ترتيب تحميل الملفات (Tree-shaking)
-
تحسينات الأداء في الملفات المجمعة
مكان وجود الملفات الناتجة:
يتم وضع الملفات الناتجة في مجلد dist/filtroApp/
خيارات النشر
1. عبر Firebase Hosting
bashnpm install -g firebase-tools firebase login firebase init firebase deploy
2. عبر GitHub Pages
bashng add angular-cli-ghpages ng deploy --base-href=/اسم_المشروع/
3. عبر خادم Nginx
-
نسخ محتوى مجلد
dist/إلى مجلد/var/www/htmlفي الخادم -
إعداد ملف
nginx.confللإشارة إلى هذا المسار -
إعادة تشغيل الخدمة
اعتبارات إضافية للنشر
-
تأكد من إعداد المسارات بشكل صحيح في
angular.jsonتحتbaseHref. -
تفعيل خدمة الـ Gzip Compression على الخادم لتسريع تحميل الملفات.
-
إضافة ملفات
robots.txtوsitemap.xmlلتحسين توافق الموقع مع محركات البحث.
الخاتمة
يمثل دمج ميزة الترشيح في تطبيقات Angular خطوة بالغة الأهمية نحو تعزيز التفاعل وتجربة المستخدم، ويدل على احترافية في التصميم والتنفيذ. وعند دمج هذه الخاصية مع خطط نشر مدروسة، يصبح التطبيق جاهزاً للوصول إلى الجمهور بكفاءة عالية. يساهم الإعداد الجيد واتباع الممارسات المثلى في ضمان الأداء والموثوقية وسهولة الصيانة على المدى الطويل، خصوصاً في التطبيقات ذات البيانات الديناميكية أو المعقدة.
المراجع:
-
Angular Documentation – https://angular.io/docs
-
Angular CLI Deployment Guide – https://angular.io/guide/deployment

