🧭 Angular Routing: بناء تطبيق SPA متعدد الصفحات باحترافية
تقدمك في المستوى الرابع75%
🔀 لماذا نحتاج Routing في Angular؟
في التطبيقات الحقيقية، المستخدمين محتاجين يتنقلوا بين صفحات مختلفة: الصفحة الرئيسية، صفحة المنتجات، صفحة التفاصيل، صفحة تسجيل الدخول، إلخ. في الموقع العادي، كل صفحة بتكون ملف HTML مستقل وبتتحمل من السيرفر. لكن في Single Page Application (SPA) زي Angular، الصفحة الواحدة بتتحمل مرة واحدة، والتنقل بين "الصفحات" بيحصل داخلياً من غير ما نعيد تحميل الصفحة.
Angular Routing هو النظام اللي بيدير التنقل ده. بيغير الـ URL في المتصفح، بيحمل المكون المناسب، وبيحافظ على تاريخ التنقل (Back/Forward buttons شغالة عادي). ده بيخلي التطبيق سريع وسلس زي تطبيق الموبايل.
بنهاية هذا الدرس، هتكون قادر على:
إعداد نظام Routing كامل في Angular من الصفر
التنقل بين الصفحات باستخدام routerLink و Router
إنشاء مسارات ديناميكية (Dynamic Routes) مع معاملات متغيرة
حماية المسارات باستخدام Route Guards (Auth Guards)
تحميل المسارات بشكل مؤجل (Lazy Loading) لتحسين الأداء
التعامل مع صفحات 404 (Not Found)
💡 مثال من الحياة العملية: تخيّل تطبيق فيسبوك. لما تدخل على صفحة شخص، الـ URL بيتغير لـ /profile/ahmed، لكن الصفحة مش بترجع تتحمل من الأول. Angular Routing بيحمل مكون ProfileComponent ويمررله معامل ahmed، وكل ده بيحصل في جزء من الثانية.
⚡ إعداد Routing الأساسي
Angular بتوفر نظام Routing مدمج في الإطار. أول خطوة هي إنشاء ملف Routing يحتوي على تعريف كل المسارات (Routes).
<!-- user-list.component.html --><divclass="user-list"><h2>👥 قائمة المستخدمين</h2><div *ngFor="let user of users"class="user-item"><img [src]="user.avatar" [alt]="'صورة ' + user.name"><h3>{{ user.name }}</h3><!-- ✅ طريقة 1: routerLink مع مصفوفة --><a [routerLink]="['/user', user.id]"class="btn-primary">
عرض التفاصيل
</a><!-- ✅ طريقة 2: routerLink مع string interpolation --><a [routerLink]="'/user/' + user.id"class="btn-primary">
عرض التفاصيل
</a></div></div>
📌 لماذا نستخدم +params['id']؟
المعاملات في URL بتكون دائماً String. لو عايز number، استخدم +params['id'] (علامة + بتعمل Type Coercion) أو Number(params['id']).
🔀 التنقل البرمجي - Programmatic Navigation
أحياناً مش عايز تستخدم رابط HTML - عايز تنقل المستخدم برمجياً بناءً على منطق معين (زي بعد تسجيل الدخول الناجح، أو بعد إرسال نموذج).
استخدم routerLink للتنقل من القالب: أسرع وما بيعيدش تحميل الصفحة.
استخدم Router للتنقل البرمجي: بعد تسجيل الدخول، بعد إرسال نموذج، إلخ.
استخدم ActivatedRoute للحصول على معاملات الـ URL: params و queryParams.
استخدم Route Guards لحماية المسارات: AuthGuard للصفحات المحمية.
استخدم Lazy Loading للمسارات الثقيلة: Admin Panel، Dashboard، إلخ.
أضف routerLinkActive لتمييز الرابط النشط: UX أفضل للمستخدم.
استخدم wildcard ** لمسار 404: في آخر القائمة دايماً.
استخدم [routerLinkActiveOptions]="{exact: true}" للرابط الرئيسي: عشان ما يفضلش نشط في كل المسارات.
📚 دروس ذات صلة
❓ أسئلة شائعة عن Angular Routing
ما الفرق بين RouterModule.forRoot و forChild؟
forRoot بتستخدم في AppRoutingModule (الرئيسي) وبتسجل الـ Router Services مرة واحدة. forChild بتستخدم في Feature Modules (زي AdminRoutingModule) وبتسجل المسارات بس من غير ما تعيد تسجيل الـ Services. استخدام forRoot أكتر من مرة بيسبب خطأ.
هل Lazy Loading يؤثر على SEO؟
في Angular Universal (SSR)، لا. Googlebot بيقدر يفهرس المحتوى المحمل بشكل Lazy. لكن في SPA عادي، قد يكون فيه تأخير بسيط. الحل: استخدم Angular Universal (Server-Side Rendering) عشان يتحمل المحتوى على السيرفر قبل ما يوصل للمتصفح.
إزاي أعمل Redirect بعد تسجيل الدخول؟
استخدم Router.navigate(['/dashboard']) بعد ما تتحقق من صحة البيانات. لو عايز ترجع للصفحة اللي المستخدم كان عايز يدخلها قبل ما يتوجه لـ Login، خزن الـ URL في localStorage أو استخدم returnUrl parameter.
ما الفرق بين params و queryParams؟
params هي جزء من الـ URL path (زي /user/123 - 123 هو param). queryParams هي بعد علامة ? (زي /products?search=iphone&page=1). params بتستخدم للـ IDs، وqueryParams بتستخدم للفلاتر والبحث.