البرمجة

إدارة المجموعات في AngularJS

المجموعات (Collections) في AngularJS: دراسة معمقة

تُعد المجموعات (Collections) أحد العناصر الأساسية في بناء التطبيقات باستخدام AngularJS، إذ تُمثل البنية التي تُخزن وتُدار فيها البيانات ضمن واجهات المستخدم الديناميكية. وتنبع أهمية فهم كيفية التعامل مع المجموعات من كون AngularJS إطار عمل JavaScript يعتمد على المعالجة التفاعلية للبيانات في الزمن الحقيقي (real-time data binding) بين النموذج (Model) والعرض (View)، وهو ما يُحتم أن تكون طرق إدارة وتصفية وترتيب وعرض البيانات فعّالة وسليمة.

يُقدم AngularJS مجموعة من الأدوات التي تُساعد على التعامل مع المجموعات بطريقة مُبسطة وآمنة، مثل ngRepeat, orderBy, filter, وtrack by. يُضاف إلى ذلك مجموعة من الدوال المُساعدة التي تُوفرها الوحدة المساعدة angular ضمن مكتبة JavaScript لتسريع العمل على المجموعات. من خلال هذا المقال، سيتم استعراض شامل لجميع المفاهيم المرتبطة بالمجموعات في AngularJS من حيث الإنشاء، التكرار، الفلترة، الفرز، والتتبع.


أولًا: تعريف المجموعات (Collections) في AngularJS

في AngularJS، تُعرَّف المجموعات بأنها بنى تحتوي على مجموعة من العناصر (objects) أو القيم (values) التي يمكن التعامل معها باستخدام تعليمات AngularJS. وعادة ما تكون هذه المجموعات عبارة عن مصفوفات (Arrays) أو كائنات (Objects)، تُربط بالنموذج (Model) الذي يتحكم في بيانات العرض (ViewModel).

أنواع المجموعات

النوع التوصيف
مصفوفة Array قائمة مرتبة من القيم يمكن تكرارها بسهولة باستخدام ngRepeat.
كائن Object زوج من مفتاح وقيمة، مفيد في عرض الخصائص المختلفة لكائن ما.

ثانيًا: استخدام ngRepeat لتكرار المجموعات

يُعد ngRepeat أحد أهم توجيهات AngularJS المستخدمة في عرض عناصر المجموعات داخل واجهات المستخدم. يسمح هذا التوجيه بتكرار عنصر HTML لعدد من المرات يتوافق مع عدد العناصر داخل المجموعة، ويُعد مثالًا واضحًا على الربط الديناميكي بين النموذج والعرض.

الصيغة العامة

html
<div ng-repeat="item in collection"> {{ item }} div>

مثال تطبيقي:

html
<ul> <li ng-repeat="user in users"> {{ user.name }} - {{ user.email }} li> ul>

في المثال أعلاه، يقوم ngRepeat بتكرار عنصر

  • لكل عنصر في المصفوفة users.


    ثالثًا: تحسين الأداء باستخدام track by

    عند التعامل مع قوائم كبيرة أو في حال كانت هناك عمليات إدخال وحذف متكررة من المجموعة، يصبح من المهم تحسين أداء التكرار باستخدام خاصية track by. تُمكّن هذه الخاصية AngularJS من تتبع العناصر بكفاءة عند إعادة التهيئة (re-rendering)، مما يقلل من العمليات الحسابية الداخلية.

    الصيغة:

    html
    <div ng-repeat="item in items track by item.id"> {{ item.name }} div>

    تُساعد هذه التقنية على تقليل إعادة التهيئة الكاملة للعناصر عند التعديل أو التحديث، إذ يُحدد العنصر بمفتاح فريد.


    رابعًا: ترتيب المجموعات باستخدام orderBy

    يُستخدم orderBy لترتيب عناصر المجموعات حسب خاصية معينة، ويمكن استخدامه ضمن ngRepeat أو مباشرة من خلال الفلاتر في JavaScript.

    الصيغة:

    html
    <div ng-repeat="product in products | orderBy:'price'"> {{ product.name }} - {{ product.price }} div>

    كما يمكن الترتيب تنازليًا بإضافة علامة الطرح -:

    html
    <div ng-repeat="product in products | orderBy:'-price'"> {{ product.name }} - {{ product.price }} div>

    خامسًا: فلترة المجموعات باستخدام filter

    تسمح خاصية filter بإنشاء عرض ديناميكي لمجموعة من العناصر بناءً على معيار معين. وتُستخدم هذه الخاصية لتمكين البحث أو التصفية حسب الشروط المدخلة.

    مثال:

    html
    <input type="text" ng-model="searchQuery"> <ul> <li ng-repeat="contact in contacts | filter:searchQuery"> {{ contact.name }} li> ul>

    في هذا المثال، يتم عرض العناصر المتوافقة فقط مع الكلمة المفتاحية المُدخلة في searchQuery.


    سادسًا: التعامل البرمجي مع المجموعات

    يوفر AngularJS مجموعة من الدوال المساعدة angular.forEach وangular.copy وangular.isArray، لتسهيل عمليات التحقق والتكرار والنسخ بين المجموعات.

    angular.forEach

    يُستخدم لتكرار العناصر داخل مجموعة معينة:

    javascript
    angular.forEach($scope.items, function(item) { console.log(item); });

    angular.copy

    لنسخ مجموعة دون ربطها بالإشارة المرجعية (reference):

    javascript
    var newItems = angular.copy($scope.items);

    angular.isArray

    للتحقق مما إذا كانت القيمة تمثل مصفوفة:

    javascript
    if (angular.isArray($scope.products)) { console.log("المجموعة عبارة عن مصفوفة"); }

    سابعًا: الربط الثنائي والربط الأحادي للمجموعات

    من أبرز ميزات AngularJS القدرة على الربط الثنائي للبيانات (Two-Way Data Binding)، حيث يتم تحديث العرض تلقائيًا عند تغير البيانات في النموذج، والعكس صحيح.

    لكن عند الحاجة لتقليل الحمل الحسابي يمكن استخدام الربط الأحادي (One-Time Binding) عن طريق :: لتحديث العرض مرة واحدة فقط.

    مثال على الربط الأحادي:

    html
    <div>{{::user.name}}div>

    يتم هنا عرض الاسم مرة واحدة فقط ولن يتم تحديثه عند تغير القيمة في النموذج.


    ثامنًا: تصفية المجموعات باستخدام دوال مخصصة

    إلى جانب filter وorderBy المدمجين، يمكن للمطورين كتابة دوال مخصصة لتصفية المجموعات حسب شروط معينة.

    مثال على فلترة برمجية:

    javascript
    $scope.expensiveItems = $scope.items.filter(function(item) { return item.price > 100; });

    تُستخدم هذه الطريقة عندما تتطلب الفلاتر منطقًا أكثر تعقيدًا من المتاح عبر filter.


    تاسعًا: استخدام المجموعات داخل التوجيهات المخصصة (Custom Directives)

    يُستخدم مفهوم المجموعات أيضًا ضمن التوجيهات المخصصة التي تُبنى لتعزيز مكونات قابلة لإعادة الاستخدام. وغالبًا ما تُمرر المجموعات إلى التوجيهات عبر الخصائص (Attributes) ويُتعامل معها داخليًا من خلال scope.

    مثال:

    html
    <product-list items="products">product-list>
    javascript
    app.directive('productList', function() { return { restrict: 'E', scope: { items: '=' }, template: '
    {{ product.name }}
    '
    }; });

    عاشرًا: جداول توضيحية للمقارنة والوظائف

    جدول مقارنة بين ngRepeat, filter, orderBy, track by

    الوظيفة الاستخدام الأداء قابلية التوسع
    ngRepeat تكرار العناصر من مجموعة عالي ممتاز
    filter تصفية عناصر المجموعة بناءً على معيار متوسط جيد
    orderBy ترتيب عناصر المجموعة متوسط جيد
    track by تحسين الأداء بتتبع العنصر باستخدام مفتاح فريد عالي ممتاز

    الحادي عشر: أفضل الممارسات عند التعامل مع المجموعات في AngularJS

    • استخدام track by مع ngRepeat دومًا لتفادي مشاكل الأداء عند إعادة التكرار.

    • تجنب التكرار على الكائنات (Objects) عند استخدام ngRepeat والاقتصار على المصفوفات، حيث أن التكرار على كائنات قد يكون غير متوقع الترتيب.

    • فصل المنطق المعقد للفلترة في Controllers أو Services بدلًا من تضمينه مباشرة في HTML.

    • عدم تعديل المجموعات المرتبطة مباشرة بـ $scope في العرض، بل العمل على نسخ منها.

    • استخدام One-Time Binding للعناصر غير المتغيرة لتحسين الأداء.


    الثاني عشر: تأثير المجموعات على تحسين تجربة المستخدم

    من خلال استخدام المجموعات بطرق فعالة، يمكن إنشاء واجهات تفاعلية تعتمد على العرض الديناميكي للبيانات مما يوفر تجربة مستخدم عالية الجودة. تُمكن الفلاتر والتكرار الديناميكي المستخدم من التفاعل مع المعلومات في الزمن الفعلي بدون الحاجة إلى تحديث الصفحة أو إرسال طلبات إلى الخادم باستمرار.


    الثالث عشر: تطبيقات عملية تعتمد على المجموعات في AngularJS

    • أنظمة إدارة المنتجات (Product Management): عرض قائمة المنتجات، ترتيبها، تصفيتها، والسماح بتحريرها.

    • أنظمة الرسائل (Messaging Systems): قائمة الرسائل، تحديثات فورية، بحث في الرسائل.

    • لوحات المعلومات التفاعلية (Dashboards): عرض جداول البيانات والإحصائيات بناءً على مجموعات من المعلومات.

    • أنظمة التعليم الإلكتروني: عرض الدورات، المحتوى، نتائج الطلاب ضمن مجموعات منظمة وقابلة للتصفية والترتيب.


    المراجع

    1. AngularJS Documentation – https://docs.angularjs.org/guide

    2. AngularJS API Reference – https://docs.angularjs.org/api