لوحة المتصدرين
المحتوى الأكثر حصولًا على سمعة جيدة
عرض المحتوى الحاصل على سمعة أكبر منذ 02/07/26 في كل الموقع
-
السادة الافاضل مرفق الكود التالى var value1 = "32"; var value2 = 10; var value3 = 7; var sum = value1 + value2 + value3; console.log(sum); بيرجع 32107 و الكود التالى بيرجع var value1 = 32; var value2 = 10; var value3 = 7; var sum = value1 + value2 + value3; console.log(sum); بيرجع 49 الكود الاول تعامل مع جميع الارقام على انها من النوع STRING بينما الكوت الثانى تعامل مع جميع الارقام ك NUMBER مع العلم عند الرجوع الى Type coercion وكتابه true == "1" بيكون الناتج true ويتم تحويل نوع البايانت من string to number بشكل ضمنى لماذا لايتم مثل هذا فى المثال الاول بناءا على Type coercion3 نقاط
-
هل يكفي 4 مسارات للإختبار ؟ + 4 مسارات المقصدود بها مثلا قاعدة البيانات كامله ولا فقط اقدر اكتفي بجزء من الدروس يتم ارفاقها في القيت هب ؟؟ مثلا قاعدة البيانات يوجد بها 5 دروس هل يكتفي فقط بإنشاء قاعدة بيانات ولا يتعين مني ارفاق المشاريع 5 ؟2 نقاط
-
ماهو خيار انسب ان اركز عليه في وقت حالي ك Backend Engineer لارافيل ولا نيست لان انا صراحة اميل ال لارافيل بسبب سرعته في انجاز مشروع وبنفس وقت اميل ال Nest.js بسبب صرامته في كتابة كود احترافي ومناسب للمشاريع حية RealTime في رأيكم في عام 2026 ماهو خيار افضل ؟2 نقاط
-
انا كاتبه كل الاكواد الدروس مع بعض لما بطبق هل ده صح لعرضه لاخد الشهاده2 نقاط
-
let title = document.getElementById('title'); let price = document.getElementById('price'); let taxes = document.getElementById('taxes'); let ads = document.getElementById('ads'); let discount = document.getElementById('discount'); let total = document.getElementById('total'); let count = document.getElementById('count'); let category = document.getElementById('category'); let submit = document.getElementById('submit'); function getTotal() { if (price.value != '') { let result = (+price.value + +taxes.value + +ads.value) - +discount.value; total.innerHTML = result; total.style.background = '#040'; } else { total.innerHTML = ''; total.style.background = '#a00'; } } function updataData() { } let dataPro; if (localStorage.product != null) { dataPro = JSON.parse(localStorage.product) } else { dataPro = []; } submit.onclick = function () { let newPro = { title: title.value, price: price.value, taxes: taxes.value, ads: ads.value, discount: discount.value, total: total.innerHTML, count: count.value, category: category.value, } dataPro.push(newPro); localStorage.setItem('product', JSON.stringify(dataPro)) clearData() showData() } function clearData() { title.value = ''; price.value = ''; taxes.value = ''; ads.value = ''; discount.value = ''; total.innerHTML = ''; count.value = ''; category.value = ''; } function showData() { let table = ''; for (let i = 0; i < dataPro.length; i++) { table += ` <tr> <td>${i}</td> <td>${dataPro[i].title}</td> <td>${dataPro[i].price}</td> <td>${dataPro[i].taxes}</td> <td>${dataPro[i].ads}</td> <td>${dataPro[i].discount}</td> <td>${dataPro[i].category}</td> <td>${dataPro[i].total}</td> <td><button id="updat">update</button></td> <td><button onclick="deleteData(${i})" id="delete" onclick="deleteData(i)">delete</button></td> </tr> ` console.log(table) } document.getElementById('tbody').innerHTML = table; let btnDelete = document.getElementById('deleteAll'); if (dataPro.length > 0) { btnDelete.innerHTML = <button onclick="deletAll()"> delete All</button> } else { btnDelete.innerHTML = ''; } } howData() function deleteData(i) { console.log(i) } function deletAll() { localStorage.clear() dataPro.splice(0) showData() } jj.jsstyle.css index.html2 نقاط
-
2 نقاط
-
هل هناك سبب منطقى لبدأ العد من الصفر ؟ سؤال جاء فى عقلى وانا استخدم index string[0]2 نقاط
-
كيف يمكننى عمل string باستخدام js واريد طباعة جزء من string فى السطر الاول والجزء الاخر فى السطر الثانى "Up up down down" return 'up up down down'2 نقاط
-
بخصوص جمع string مثل "Hello " + "World" هذا سهل وبسيط وواضح لكن فى "Hello + 5*10" ترجع 'Hello + 5*10' المثال التالى ايضا "Hello" + 5*10 ترجع Hello50 كيف ل جافا اسكريبت ان تفكر وتتعامل مع مثل هذا البيانات؟2 نقاط
-
أظن أن في دورة الذكاء الاصطناعي حصل خربطة في ترتيب المسارات بسبب التحديث الذي حصل على المسارات القديمة وتم تجديدها ولكن الآن ما هي الطريقة الصحيحة لحضور الدورة بشكل كامل بالترتيب؟ أنا حضرت مسار Transformers ولكن تبين لي أنني يجب علي أن أحضر مسار آخر قبله وتركته في المنتصف وانتقلت إلى مسار آخر وهو مسار التعامل مع البيانات والمسارات التي قبل Transformers حضرتها فما الذي يجب علي أن أحضره التالي؟ هل يمكنكم مساعدتي وأن تعطوني الترتيب المناسب لحضور هذه المسارات؟2 نقاط
-
سلام عليكم تواصلت مع فريق الدعم من اجل التخرج واستلمت طلبات مشروع تخرج وقمت بتنفيذه وتسلميه ولم استلم رد هل من الممكن ان يكون تحت المراجعة واذا كان تحت المراجعة فكم المدة التي يجب انتظارها وسطياً2 نقاط
-
انا مختص حاليا في باك اند وعندي خبرة في لارافيل و Nest.js معا وبنيت مشاريع قوية وكبيرة في كلا إطارين المقصد هو أن هل اركز على لارافيل أكثر ام اركز على نيست جي اس من أجل سوق العمل وعمل ضمن شركات وبالنسبة لل لغة PHP لدي خبرة فيها1 نقطة
-
السلام عليكم ما رأيكم في شركة https://www.dzsecurity.com/ar/ اريد ان استضيف موقع static مبني بNext.js و تطبيق كامل مبني بReact + backend (لم احدد بعد) اريد استضافة جيدة و سعر منخفض هل هي افضل خيار ؟ بارك الله فيكم1 نقطة
-
السلام عليكم. لقد انهيت مشاهدة + تطبيق + دراسة المفاهيم الجديدة لمسار "تطوير متجر إلكتروني بإستخدام Django", و كذلك قمت بدراسة مسار "أساسيات JavaScript" من دورة "تطوير التطبيقات بإستخدام JavaScript". اريد الآن تطوير تطبيق جديد بنفسي و قد اخترت فكرة "موقع لحجز تذاكر". 1- هل من الممكن ان تفترحو علي مطاليب معينة لعمل التطبيق ؟ ام الأفضل ان ابحث عن هذا الشيء بنفسي ؟ 2- بحكم انها المرة الأولى لي لتطوير تطبيق كبير نسبيا عما كنت افعله من ذي قبل, ما هي اهم النصائح لتطوير التطبيق ؟ 3- كيف اتعامل مع جزئية تنسيق الموقع بإعتبار اني لم ادرس CSS من قبل ؟ 4- كم الوقت الواقعي الذي يجب تحديده لإنهاء تطوير التطبيق ؟ شكرا لكم.1 نقطة
-
الأفضل إطار عام للمشروع، وأنت تبحث في التفاصيل للجمع بين الفائدتين، والمتطلبات الأساسية MVP التي ستبدأ بها هي ما يلي: نظام تسجيل دخول وإنشاء حساب صفحة عرض الفعاليات سواء حفلات، مباريات، سينما، قم باختيار نوع واحد. صفحة تفاصيل الفعالية وبها التاريخ، المكان، السعر، المقاعد المتاحة. إمكانية اختيار المقاعد أو عدد التذاكر. سلة حجز بسيطة. صفحة تأكيد الحجز. لوحة تحكم المستخدم وبها الحجوزات. لوحة تحكم الأدمن لإدارة الفعاليات. وفيما بعد تستطيع إضافة المزايا التالية: نظام دفع وهمي أو حقيقي مثل Stripe. إرسال التذكرة بالإيميل أو PDF نظام بحث وفلترة الفعاليات تقييم الفعاليات نظام كوبونات خصم QR Code للتذكرة إشعارات تذكير بموعد الفعالية. يجب التخطيط قبل كتابة الكود، قم برسم الصفحات على ورقة أي إنشاء Wireframes أ واستخدم أداة رقمية لذلك. ثم حدد الـ Models وعلاقاتها، ثم اكتب قائمة بكل الـ URLs، وقسم المشروع لمراحل صغيرة ولا تنظر إليه ككل ولا تحاول بناء كل شيء دفعة واحدة بل ابدأ بأبسط نسخة تعمل. ةاستخدم Git من اليوم الأول ويجب تسجيل كل تغيير بـ commit واضح، واختبر كل ميزة فور بنائها ولا تبني 5 ميزات ثم تختبر. واتبع منهج التطوير التدريجي، كالتالي: المرحلة الأولى Models و Admin Panel. الثانية صفحة عرض الفعاليات صفحة التفاصيل نظام المستخدمين نظام الحجز لوحة تحكم المستخدم التنسيق والتحسين ولا تقارن مشروعك بمشاريع المحترفي، ركز على التعلم وليس الكمال. الأفضل استخدم Bootstrap لأنّ tailwind يتطلب معرفة بـ CSS، ويوجد قوالب Bootstrap جاهزة تفقد startbootstrap.com أو bootstrapmade.com وعندما تحتاج تعديل بسيط، ابحث عنه. لكن في حال تريد أن تصبح مطور ويب فيجب تعلم CSS وليس تجنبها. عامًة لا تضيع وقتك في التصميم في البداية اجعل الموقع يعمل أولاً ثم عدل التنسيق. لم تذكر الوقت المخصص يوميًا، على إفتراض 3 ساعات يوميًا ستحتاج إلى أسبوعين أو ثلاثة للإنتهاء من MVP. لكن الهدف هو التعلم وليس السرعة، ومن الطبيعي أن تقضي يوم كامل على مشكلة واحدة.1 نقطة
-
1 نقطة
-
الفرق الذي لاحظته في الأمثلة يعود إلى آلية التحويل الضمني (Type coercion) في جافاسكريبت، ولكن هناك عند وجود عملية جمع (+)، إذا كان أحد الطرفين سلسلة نصية (string)، فإن جافاسكريبت تحول الطرف الآخر تلقائيًا إلى string أيضًا وتقوم بعملية الربط النصي (concatenation) بدل الجمع العددي. في المثال الأول: var value1 = "32"; // string var value2 = 10; // number var value3 = 7; // number var sum = value1 + value2 + value3; console.log(sum); // "32107" بسبب أن value1 نصية، عند كتابة value1 + value2، يحوّل value2 إلى نص ويجمعهم نصيًا "3210". ثم يضاف value3 "32107". في المثال الثاني: كل القيم أرقام، لذلك يتم الجمع الطبيعي 32 + 10 + 7 = 49. لتجنب هذا السلوك، يمكنك استخدام Number() لتحويل أي قيمة نصية إلى رقم قبل الجمع: var sum = Number(value1) + value2 + value3; console.log(sum); // 49 بالتوفيق1 نقطة
-
هذا الأمر بالفعل يسبب إلتباس وخطأ وهو يكمن في الفرق بين التحويل الضمني (Type Coercion) عند استخدام عامل الجمع و المقارنة بعامل المقارنة ==. ففي JavaScript يمتلك عامل الجمع + وظيفتين مختلفتين تماما ويتم تحديد الوظيفة بناء على نوع البيانات : الجمع الحسابي (Addition): إذا كان الطرفين أرقاما. الدمج النصي (Concatenation): إذا كان أحد الطرفين أو كلاهما نصا (String). ففي JavaScript للنصوص الأولوية القصوى عند استخدام عامل + فبمجرد أن يرى المحرك نصا واحدا في العملية فإنه يقوم بتحويل كل ما يليه إلى نصوص ودمجها. ففي مثالك الأول: value1 هو نص "32". وعند تنفيذ value1 + value2 تصبح العملية "32" + 10. بسبب وجود النص يتم تحويل 10 إلى "10" والنتيجة "3210". ثم "3210" + 7 تصبح "32107". ولاحظ أن العملية ستختلف بناء على ترتيب الأرقام والنصوص فمثلا : var value1 = 32; var value2 = 10; var value3 = "7"; var sum = value1 + value2 + value3; console.log(sum); ستجد النتيجة 427 وذلك لأنه أولا تم جمع 32 و 10 لأنهم أرقام والناتج هو 42 ومن ثم يتم جمع 42 مع النص 7 ليصبح الناتج 427 . أما بخصوص سؤالك لماذا في true == "1" يتم التحويل لرقم بينما في المثال الأول لم يحدث ذلك فإن الإجابة تكمن في أن قواعد التحويل تختلف باختلاف العامل (Operator): فعند استخدام == لمقارنة أنواع مختلفة تتبع JavaScript خوارزمية محددة تسمى (Abstract Equality Comparison Algorithm) : فإذا تم مقارنة Boolean مع أي نوع آخر يتم تحويله أولا إلى Number (أى true تصبح 1). وإذا تم مقارنة Number مع String يتم تحويل النص إلى رقم. ولذلك فإن true == "1" تتحول إلى 1 == 1 والنتيجة true. وفي حالة الجمع المحرك لا يحاول تحويل النص إلى رقم لأن الدمج النصي هو السلوك الافتراضي لعامل الجمع + وهو يفترض أنك تريد بناء نص طويل وليس بالضرورة إجراء عملية حسابية. وستلاحظ الفرق عند إستخدام عامل الطرح "-" فعامل الطرح لا يعمل إلا مع الأرقام ولذلك فإنه يجبر التحويل إلى رقم وليس سلسة نصية.1 نقطة
-
بعد ما اخلص دورة تطوير التطبيقات باستخدام لغة Python اي الوظايف اللي ممكن اشتغلها ؟ هل هكون backend ولا full stack1 نقطة
-
هل بعد مخلص كورس تطوير وجهات المستخدم المفروض اجتاز امتحان معين علشان الشهاده وازاي القي شغل وممكن اعرف افضل طريقه لمذاكره الكورسات1 نقطة
-
ماذا استطيع ان عمل في سوق الحر بعد انهاء دورة علوم كبيوتر1 نقطة
-
وعليكم السلام، هنا في: "Hello + 5*10" كل ما بين علامتي الاقتباس يعتبر نصا حرفيا فلا تنفّذ 5*10 كعملية رياضية بل تطبع كما هي داخل السلسلة فيكون الناتج "Hello + 5*10" أمّا في التعبير: Hello" + 5*10" فليس كله داخل string أولا تنفّذ عملية الضرب [5*10] فتُعطي العدد 50 لأن * له أسبقية أعلى من + بعدها يُطبَّق عامل الجمع + بين "Hello" (string) و 50 (number) وقاعدة عامل + في جافاسكربت تقول أنه إذا كان أحد الطرفين string يتم تحويل الطرف الآخر إلى string ويتم الدمج، فيتحول 50 إلى "50" وينتج "Hello50".1 نقطة
-
ذلك الأمر يتحكم به ما يسمى بتحويل الأنواع بمعنى أنه في المثال "Hello" + 5*10 * لها أولوية أعلى من +، فتحسب 5*10 أولاً وتحصل على 50. الآن التعبير أصبح: "Hello" + 50 هنا ال Type Coercion (تحويل الأنواع) عملية جمع بين نوعين مختلفين: string وnumber. قاعدة JavaScript هنا واضحة: إذا كان أحد طرفي + نصاً، يتحول الطرف الآخر إلى نص تلقائياً، وتصبح العملية دمج نصوص (concatenation) لا جمعاً رياضياً. فتتحول 50 إلى "50" ويصبح الناتج "Hello50". وإذا كان السؤال خاص بأحد دروس الدورات فيرجى طرحه أسفل الدرس1 نقطة
-
بالإضافة للشرح الرائع في التعليقات السابقة يمكنك الاستفادة من المميزات التالية التي تحسن من تجربة المستخدم أولاً بالنسبة للتنقل في الموقع فهناك بعض المميزات المهمة مثل زر "العودة للأعلى" الذي ذكرته مثال ممتاز على تحسين تجربة المستخدم Breadcrumbs في المواقع ذات الصفحات المتعددة حتى يعرف المستخدم أين هو تمييز الرابط النشط في القائمة بوضوح وبالنسبة للنماذج النماذج (Forms) عند الضغط على زر إرسال، يجب أن يرى المستخدم شيئاً يحدث (Loading spinner، رسالة نجاح، أو خطأ واضح) التحقق الفوري inline validation بدلاً من انتظار الإرسال رسائل خطأ واضحة وقريبة من الحقل المعني حفظ بيانات النموذج إذا حدث خطأ حتى لا يُعيد المستخدم الكتابة1 نقطة
-
اريد مسار واضح للذكاء الاصطناعي لان النظري كثير جدا ويفترض انه يختصر كي لا يتشتت الدارس اريد ترتيب واضح للكورس يبدأ من ثم الذي بعد ثم وهكذا لانه اشعر انه لايوجد ربط في الترتيب الحالي1 نقطة
-
وعليكم السلام ورحمة الله وبركاته . نعم غالبا المشروع تحت المراجعة وبمجرد إنتهاء المراجعة سيتم الرد عليك والتواصل معك . ونعتذر يوجد حاليا ضغط على مركز الدعم حيث يوجد العديد من المشاريع التي يتم مراجعتها حاليا ولذلك قد يتأخر الرد عليك لهذا يرجى الإنتظار إلى حين الإنتهاء من المراجعة. تحياتي.1 نقطة
-
السلام عليكم ورحمة الله وبركاته هل الشهادة الممنوحة من أكاديميتكم معترف بها دوليا. وهل يوجد حسومات خاصة بأهل سوريا في حال اشتركت بأكثر من كورس شكرا لكم1 نقطة
-
ليس المطلوب منك رفع جميع الأكواد والدروس . بل المطلوب فقط هو رفع الأكواد الخاصة بالدروس العملية فأى درس أو مسار تجد به كلمة تطبيق عملي أو مشروع كبير يكون في عدة دروس أو مسار كامل أى يحوي العديد من الملفات والمجلدات هذه هي المشاريع التي يجب أن يتم رفعها . ولا يجب أن تكتب تماما ما قام به المدرب بل يمكنك التعديل عليه بأسلوبك إذا أردت أهم شئ أن يعمل التطبيق والمشروع كما لدى المدرب . وفكرة رفع الأكواد هي أنه سيتم مراجعتها ومناقشك بها في الإختبار وذلك أولا للتأكد من إتمامك الفعلي للدورة وأيضا لإكتشاف مدى القصور لديك والضعف في أقسام الدورة وتوجيهك لتحسين هذا القصور . وأخيرا البرمجة ما هي إلا كتابة أكواد والتطبيق العملي فهذا الأمر هو ما سيعطيك الخبرة في هذا المجال فالمشاهدة النظرية لن تفيدك في شئ فعند التطبيق ستتعلم أمور كثيرة وستجد أخطاء تحدث معك وحينها ستتعلم منها هي أيضا ولن تخطأ بها مرة أخرى . وأيضا التكرار يقوم بتثبيت المعلومات لديك وهذا ما يحتاجه الطالب في بداية تعلمه حتى لا ينسى ما قام بدراسته سريعا.1 نقطة
-
الإمتحان باللغة العربية، آلية الإختبار هي كالتالي: بعد إنهاء 4 مسارات من الدورة على الأقل، أو الدورة بالكامل عليك رفع المشاريع التي قمت بها بالدورة على حسابك في github، ثم التحدث لمركز المساعدة وإخبارهم أنك تريد التقدم للإختبار وتوفير روابط المشاريع على github. ثم الإنتظار لبعض الوقت لحين مراجعة المشاريع وسيتم الرد عليك، وتحديد موعد لإجراء مقابلة، وبها يتم: إجراء محادثة صوتيّة لمدة 30 دقيقة يطرح المدرّب عليك أسئلة متعلّقة بالدورة والأمور التي نفّذتها خلالها. يحدد لك المدرّب مشروعًا مرتبطًا بما قمت به أثناء الدورة لتنفيذه خلال فترة محددة تتراوح بين أسبوع إلى أسبوعين. إجراء محادثة صوتيّة أخرى لمدّة 30 دقيقة يناقش بها مشروعك وما نفذته وتطرح أسئلة خلالها. إن سارت على جميع الخطوات السابقة بشكل صحيح، تحصل على الشهادة أو يرشدك المدرّب لأماكن القصور ويطلب منك تداركها ثم التواصل معنا من جديد.1 نقطة
-
غير مهم في البداية، أي لمستوى مبتدئ ومتوسط فتستطيع أن تصبح مهندس رؤية حاسوب محترف دون الحاجة لتعلم التعزيز، حيث 95% من وظائف ومشاريع الـ CV مثل التعرف على الصور، اكتشاف الأجسام، تجزئة الصور، التعرف على الوجوه لا تستخدم تعلم التعزيز بشكل مباشر. لكن للمستوى المتقدم والمتخصص فهناك تقاطع بين المجالين في بعض التطبيقات المتقدمة مثل الـ Robotics فالروبوت يحتاج إلى رؤية بيئته أي CV لاتخاذ قرارات وذلك Reinforcement Learning. كذلك في السيارات ذاتية القيادة النظام يستخدم CV لفهم الطريق، ويستخدم RL أو تقنيات أخرى لاتخاذ قرارات القيادة، وفي بعض مهام معالجة الصور مثل تحديد أفضل سياسة لاقتصاص صورة أو تحسينها. بالتالي قم بتأجل دراسة تعلم التعزيز في الوقت الحالي، وركز على إتقان أساسيات وتقنيات الـ CV وعند الوصول لمستوى متوسط فتستطيع استكشافه كمعرفة إضافية. مهم كأساس لتعلم الآلة، ولكنه ليس مشروع CV أساسي، حيث نتعامل مع بيانات جدولية وليس صور. لكنه سيعلمك خطوات المشروع العملي أي فهم المشكلة، جمع البيانات، تنظيفها، تدريب نماذج مختلفة مثل Logistic Regression, Random Forest، وتقييمها، وتلك المهارات أساسية ومشتركة في كل فروع الذكاء الاصطناعي، بما فيها الـ CV. اعتبره تدريب على عملية بناء نموذج بشكل عام، لكن لا تتعمق فيه أكثر من اللازم، استوعب الفكرة الرئيسية، طبقها، ثم انتقل بسرعة إلى مشاريع الـ CV. ستحتاج دائمًا إلى التعمق من مصادر أخرى بجانب الدورة وذلك هو الحال في أي دورة من أي مكان، وما ذكرته ليس ضمن تخصص الدورة فمحتواها خاص بالذكاء الاصطناعي. لكن بالنسبة للغة SQL فما تم شرحه بالدورة يكفي حاليًا، وكذلك بالنسبة للـ API حيث تعلمنا فلاسك، وعند الحاجة لأمر ما تعلمه وتعمق به.1 نقطة
-
لتجنب إدخال نفسك في متاهة مفرغة، أرجو إنشاء مجلد للدورة ثم بداخله قم بإنشاء عدّة مجلدات حيث مجلد لكل مسار في الدورة. وبداخل كل مجلد قم بوضع التطبيقات العملية التي قمنا بها في ذلك المسار، ثم رفع المجلد الرئيسي بالكامل بما يحتويه من مجلدات على مستودع GitHub وتوفير الرابط الخاص به عند التقدم للإختبار. وفي حال وجود مشروع به الكثير من الملفات والمجلدات ويحتاج إلى مجلد خاص به مثل مشروع taskaty هنا تقوم برفع المشروع على مستودع GitHub منفصل خاص به. فعلى أي حال أنت ستقوم بالتطبيق العملي الذي جاء بالشرح، فلا يصح تعلم البرمجة بمجرد المشاهدة ولا تعتمد على استيعابك وحده أو الحفظ، كلاهما مهم بالطبع، لكن التطبيق العملي هو الأهم. كل شخص له أسلوب يُناسبه في الدراسة، لكن المهم هو تجنب المشاهدة السلبية وتخصيص وقت أكبر للتطبيق العملي، فالبرمجة عبارة عن تفكير منطقي لحل مشكلة ثم تنفيذ ذلك من خلال كتابة الكود. بالنسبة لطريقة الدراسة البعض يُفضل كتابة مُلخصات لكل شيء، لكن لا أنصحك بذلك، اكتفي فقط بكتابة ملاحظات ومُلخصات ورسومات للأمور النظرية أو معلومة معينة تريد الإحتفاظ بها للعودة إليها للمراجعة. بينما البرمجة نفسها اكتفي بالتطبيق العملي فهو الأهم وبدونه فلا معنى للمُلخصات النظرية مهما كتبت، ببساطة لن تستطيع قيادة سيارة بمشاهدة فيديو صحيح؟ وحاول تجنب الإنقطاعات المتكررة خاصًة في البداية، حاول الدراسة بإنتظام بحد أدنى ساعتين يوميًا أو شبه يومي. ستجد تفصيل هنا:1 نقطة
-
جميع الأمور المالية تتم من خلال مركز المساعدة حيث يقوم المدربون بالمتباعة معك بعد الإنتهاء من الدورة والحصول على الشهادة ولا يتم تركك بل يتم توجيهك لحين الحصول على وظيفة ولو لم تحصل عليها سيتم رد الأموال إليك . ويمكنك محادثة مركز المساعدة من خلال الرابط التالي للحصول على تفاصيل أكثر حولها : https://support.academy.hsoub.com/conversations1 نقطة
-
الامر بسيط ويوجد عدة طرق ولكن الافضل هو . اولا انشاء متغير يحمل المنشورات التى تم تحميلها الى الان حيث لا نريد فى كل مرة يصل المستخدم الى اخر الصفحة وناتى بالمنشروات من جديد , ونعطى قيمة افتراضية لهذا المتغير بمصفوفة فارغة . public $postCotainer = []; وايضا نقوم بانشاء متغيرين اخرين احدهما يحمل القيمة الافتراضية لعدد المنشورات التى سيتم تحميلها فى بداية الصفحة او حتى عند التمرير لاسفل الصفحة . والاخر يحمل عدد المنشورات الذى تم عرضها الى الان . public $take = 5; public $skip = 0; والان نقوم بانشاء استماع الى حدث التمرير جديد وفى الدالة نقوم بزيادة عدد المنشورات التى عرضها . protected $listeners = ['scrollPosts'=>'getMorePosts']; public function getMorePosts() { $this->skip += $this->take; } هكذا كل مرة يتم التمرير لاسفل الصفحة نقوم بزيادة العدد الذى تم عرضه . والان فى الدالة getPostsProperty نضع هذا الكود. public function getPostsProperty() { $ids = auth()->user()->following()->wherePivot('confirmed', true)->get()->pluck('id'); $this->postCotainer = array_merge($this->postCotainer,Post::whereIn('user_id', $ids)->latest()->skip($this->skip)->take($this->take)->get()->all()); return $this->postCotainer; } لاحظ هنا اننا اولا استخدمنا دالة array_merge وذلك لدمج المنشورات التى تم تحميلها سابقا الى المنشورات الجديدة الذى سوف يتم تحميلها . ولاحظ اننا فى الاستعلام الخاص بال sql اضفنا داليتن الاولى هى skip اى اننا لا نريد ان ناتى بعدد معين بالمنشورات وهى المنشورات التى تم تحميلها بالفعل ولذلك نمرر لها المتغير skip الذى يحمل عدد المنشروات الذى تم تحميلها الى الان. والدالة take التى تسمح لنا باحضار عدد معين فقط من المنشورات ولذلك ارسلنا لها المتغير take الذى يحمل عدد المنشورات التى نريد عرضها . وبهذا نكون قد انتهينا من الكود الخلفى . ولكن ستجد مشكلة سوف تحدث فى الحدث الذى لديك toggleFollow فمثلا اذا قام المستخدم بالغاء متابعه او متابعه مستخدم جديد فان منشوراته التى تم تحميلها سابقا نريد ان نحذفها او عرضها . لذلك سنجعل عند استماع الى الحدث toggleFollow هو حذف جميع المنشورات التى تم تحميلها سابقا واعادة التحميل من جديد حتى لا تحدث تلك المشكلة.وهذا هو كود المكون كاملا بعد التعديل. <?php namespace App\Livewire; use Livewire\Component; use App\Models\Post; class PostsList extends Component { protected $listeners = ['toggleFollow' => 'resetPosts','scrollPosts'=>'getMorePosts']; public $take = 5; public $skip = 0; public $postCotainer = []; public function resetPosts() { $this->postCotainer = []; $this->take = 5; $this->skip = 0; } public function getPostsProperty() { $ids = auth()->user()->following()->wherePivot('confirmed', true)->get()->pluck('id'); $this->postCotainer = array_merge($this->postCotainer,Post::whereIn('user_id', $ids)->latest()->skip($this->skip)->take($this->take)->get()->all()); return $this->postCotainer; } public function getMorePosts() { $this->skip += $this->take; } public function render() { return view('livewire.posts-list'); } } اما فى الواجهة الامامية فسوف نضيف استماع الى حدث التمرير و التحقق من ان المستخدم قد قام بالتمرير الى اخر الصفحة . واذا كان قام بالتمرير الى اخر الصفحة نقوم بارسال الحدث scrollPosts الذى سوف يقوم باحضار المزيد من المنشورات وبذلك كلما قام بالتمرير ياتى بالمنشورات الجديد . <div class="w-[30rem] mx-auto lg:w-[95rem]"> @forelse($this->posts as $post) <livewire:post :post="$post" :wire:key="'post_'.$post->id" /> @empty <div class="max-w-2xl gap-8 mx-auto dark:text-gray-100"> {{ __('Start Following Your Friends and Enjoy.') }} </div> @endforelse </div> @script <script> window.onscroll = function(ev) { if ((window.innerHeight + Math.round(window.scrollY)) >= document.body.offsetHeight) { $wire.dispatch('scrollPosts'); } }; </script> @endscript وهكذا قد انتهينا من جميع الاكود ويمكنك استعمالها وستعمل معك . ويمكنك تغير القيمة الافتراضية للمتغير take على حسب عدد المنشورات التى تريدها حيث انا اعطيته قيمة ابتدائية ب 51 نقطة
