نوفيل
الرئيسيةالكورساتالتحديات⚔️ المبارزاتالمقالاتالأدواتتغريداتالمجتمع
دخولابدأ مجاناً
الرئيسيةالكورساتالتحديات⚔️ المبارزاتالمقالاتالأدواتتغريداتالمجتمع
نوفيل

منصة تعليم البرمجة الأولى بالعربي. تعلم من الصفر حتى الاحتراف مع كورسات احترافية وتحديات ذكاء اصطناعي.

المنصة

  • الكورسات
  • التحديات
  • المقالات
  • الأدوات

الحساب

  • إنشاء حساب
  • تسجيل الدخول
  • لوحة التحكم
  • الملف الشخصي

روابط

  • سياسة الخصوصية
  • شروط الاستخدام
  • عن نوفيل
  • تواصل معنا

© 2026 نوفيل. جميع الحقوق محفوظة.

صُنع بـ في مصر

نوفيل
الرئيسيةالكورساتالتحديات⚔️ المبارزاتالمقالاتالأدواتتغريداتالمجتمع
دخولابدأ مجاناً
الرئيسيةالكورساتالتحديات⚔️ المبارزاتالمقالاتالأدواتتغريداتالمجتمع
AN

منهج Angular

دليل مرجعي شامل

كل اللغات
مدرسة البرمجة/منهج Angular /إدارة مجموعات البيانات الكبيرة Entities والتخزين المؤقت باستخدام NgRx Signals

إدارة مجموعات البيانات الكبيرة Entities والتخزين المؤقت باستخدام NgRx Signals

Angular 22.1State ArchitectureNgRx SignalsEntityManagement

جدول مرجعي سريع

1
استراتيجية إدارة البيانات والتخزين المؤقتآلية التشغيل البرمجي والخصائصالتأثير الهندسي على أداء التطبيق
الطلب المباشر بدون تخزين مؤقت (No Caching)إرسال طلب جديد للسيرفر مع كل عملية تنقل أو تحديث للمكون دون حفظ البيانات محلياًيستهلك موارد الشبكة ويزيد من وقت الاستجابة للمستخدم ويضغط على الخوادم
التخزين المؤقت الدائم (Static Caching)حفظ البيانات لمرة واحدة في المتجر دون التحقق من صلاحيتها أو تاريخ تحديثهاسريع جداً في العرض ولكنه يعرض بيانات قديمة إن لم يتم تحديثها يدوياً
التخزين المؤقت الذكي مع الكيانات (Smart Entity Caching)الاعتماد على معرفات فريدة (`IDs`) مع تتبع زمن الجلب (`lastFetched`) لإدارة الصلاحية والتحديثيوازن بامتياز بين أداء العرض الفوري، تقليل طلبات الشبكة، وضمان حداثة البيانات المعروضة

الشرح

تعد إدارة مجموعات البيانات الكبيرة (Entities) والتخزين المؤقت (Caching) أمراً حاسماً لأداء التطبيقات الكبيرة. يوفر ملحق signalEntityState أو أدوات إدارة الكيانات في NgRx Signals بنية تحتية جاهزة ونظيفة للتعامل مع قوائم البيانات الضخمة (إضافة، تحديث، حذف، وبحث) دون كتابة أكواد مكررة، مما يضمن كفاءة استهلاك الذاكرة وسرعة استجابة واجهة المستخدم.

تفصيل فلسفة وعمل إدارة الكيانات والتخزين المؤقت

الاعتماد على المعرفات الفريدة (Entity Adapter Pattern):

يتيح لك نظام كيانات NgRx Signals تنظيم البيانات على هيئة جدول قواميس داخلي (Dictionary) يعتمد على معرف فريد لكل عنصر، مما يجعل عمليات البحث والتحديث تتم في زمن قدره O(1) بدلاً من البحث التسلسلي البطء.

استراتيجيات التخزين المؤقت (Caching Strategies):

عبر تخزين البيانات المستلمة مسبقاً والتحقق من صلاحيتها، يتم تقليل طلبات الشبكة غير الضرورية، مما يرفع كفاءة التطبيق ويوفر تجربة استخدام فورية وسلسة للمستخدم النهائي.

ملف المتجر لإدارة الكيانات والتخزين المؤقت (item-entity-store.ts)

typescript
1import { signalStore, withState, withMethods, patchState } from '@ngrx/signals';
2import { setEntities, addEntity, updateEntity, removeEntity, withEntities } from '@ngrx/signals/entities';
3
4interface ItemEntity {
5 id: number;
6 name: string;
7 category: string;
8}
9
10export const ItemEntityStore = signalStore(
11 { providedIn: 'root' },
12 // تفعيل ممتص الكيانات المتقدم لإدارة القوائم بكفاءة
13 withEntities<ItemEntity>(),
14 withState({
15 isLoading: false,
16 lastFetched: null as number | null
17 }),
18 withMethods((store) => ({
19 // تخزين البيانات الأولية مع التخزين المؤقت
20 CacheInitialItems(items: ItemEntity[]) {
21 patchState(store, setEntities(items), { lastFetched: Date.now() });
22 },
23 // إضافة كيان جديد بسرعة فائقة
24 addNewItem(item: ItemEntity) {
25 patchState(store, addEntity(item));
26 },
27 // تحديث كيان موجود بناءً على معرفه الفريد
28 updateExistingItem(id: number, changes: Partial<ItemEntity>) {
29 patchState(store, updateEntity({ id, changes }));
30 },
31 // حذف كيان من المجموعة
32 removeItem(id: number) {
33 patchState(store, removeEntity(id));
34 }
35 }))
36);

ملف القالب المرئي للمكون (entity-dashboard.component.html)

html
1<!-- entity-dashboard.component.html -->
2<div class="entity-container">
3 <h3>لوحة إدارة الكيانات والبيانات الكبيرة (NgRx Entity Signals)</h3>
4
5 <div class="actions-bar">
6 <button (click)="loadDemoData()" class="primary-btn">تحميل بيانات التخزين المؤقت</button>
7 <button (click)="addItem()" class="secondary-btn">إضافة عنصر للكيانات</button>
8 </div>
9
10 <ul class="entity-list">
11 @for (item of store.entities(); track item.id) {
12 <li class="entity-item">
13 <span>{{ item.name }} ({{ item.category }})</span>
14 <div class="item-btns">
15 <button (click)="updateItem(item.id)" class="edit-btn">تعديل</button>
16 <button (click)="deleteItem(item.id)" class="delete-btn">حذف</button>
17 </div>
18 </li>
19 } @empty {
20 <li>لا توجد كيانات مسجلة في المتجر حالياً</li>
21 }
22 </ul>
23</div>

⚠️ تحذير

تجنب تخزين البيانات الكبيرة بدون استراتيجية انتهاء صلاحية للتخزين المؤقت! ترك التخزين المؤقت (Caching) مفتوحاً بدون مراعاة زمن التحديث قد يؤدي إلى عرض بيانات قديمة للمستخدمين. احرص دائماً على ربط التخزين المؤقت بآليات إعادة جلب أو تحديث دورية عند الحاجة.

نصائح احترافية

  • —اعتمد على إدارة الكيانات (withEntities) عند التعامل مع قوائم البيانات الضخمة!
  • —هذه الميزة توفر عليك كتابة عمليات البحث والتحديث اليدوية وتضمن أداءً خارقاً بفضل هيكلة المعرفات الفريدة (Dictionary Lookups).

الدرس السابق

تنفيذ الأساليب والعمليات الجانبية والتعامل مع الخوادم في NgRx

الدرس التالي

دورة حياة المتجر والعمليات التلقائية باستخدام معتمدة hooks في NgRx

نوفيل

منصة تعليم البرمجة الأولى بالعربي. تعلم من الصفر حتى الاحتراف مع كورسات احترافية وتحديات ذكاء اصطناعي.

المنصة

  • الكورسات
  • التحديات
  • المقالات
  • الأدوات

الحساب

  • إنشاء حساب
  • تسجيل الدخول
  • لوحة التحكم
  • الملف الشخصي

روابط

  • سياسة الخصوصية
  • شروط الاستخدام
  • عن نوفيل
  • تواصل معنا

© 2026 نوفيل. جميع الحقوق محفوظة.

صُنع بـ في مصر