المجموعات (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
يُستخدم لتكرار العناصر داخل مجموعة معينة:
javascriptangular.forEach($scope.items, function(item) {
console.log(item);
});
angular.copy
لنسخ مجموعة دون ربطها بالإشارة المرجعية (reference):
javascriptvar newItems = angular.copy($scope.items);
angular.isArray
للتحقق مما إذا كانت القيمة تمثل مصفوفة:
javascriptif (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>
javascriptapp.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): عرض جداول البيانات والإحصائيات بناءً على مجموعات من المعلومات.
-
أنظمة التعليم الإلكتروني: عرض الدورات، المحتوى، نتائج الطلاب ضمن مجموعات منظمة وقابلة للتصفية والترتيب.
المراجع
-
AngularJS Documentation – https://docs.angularjs.org/guide
-
AngularJS API Reference – https://docs.angularjs.org/api

