-
المساهمات
6975 -
تاريخ الانضمام
-
تاريخ آخر زيارة
-
عدد الأيام التي تصدر بها
218
إجابات الأسئلة
-
إجابة Wael Aljamal سؤال في كيفية إزالة المسافات الإضافية عند إستعمال textarea مع PHP؟ كانت الإجابة المقبولة
إن سبب الخطأ لوجود شيفرة PHP على سطر جديد new line مما سبب في ظهور المسافة البيضاء.
يمكننا كتابة الشيفرة على سطر واحد إن كان بالإمكان مما يزيل الخطأ
<textarea cols="60" rows="10" name="user_bio"><?php if($user_bio) echo $user_bio;?> </textarea> وفي حال كان هنالك الكثير من الشيفرات البرمجية يمكننا تطبيق الدالة trim مثلاً في جيكويري على الحقل
$('textarea').val($('textarea').val().trim()) هذا يقوم بإعادة إسناد قيمة الحقل نفسه بدون فراغات
-
إجابة Wael Aljamal سؤال في كيفية إخفاء أعمدة معينة عند إرجاع كائن Eloquent كـ JSON في لارافيل Laravel؟ كانت الإجابة المقبولة
توفر لارافل دالة لتطبيق إخفاء حقول معينة لكائن ما خلال سياق تنفيذ البرنامج، أي يمكننا تطبيقها قبل إعادة الرد، وهما الدالتين makeHidden وتقبل تمرير مصفوفة فيها أسماء الحقول التي نود إخفائها من الرد،
وكتطبيق على مثالك تصبح الشيفرة كالتالي:
الصيغة العامة return $user->makeHidden('attribute')->toJson(); ^^^^^^^^ أكثر من حقل return $user->makeHidden(['attribute1','attribute2'])->toJson(); return $user->makeHidden(['address', 'phone_number']); تطبيق return $user->makeHidden('password')->toJson(); وعكسها هي makeVisible
التوثيق: تعديل محددات الوصول مؤقتاً temporarily modifying attribute visibility laravel
-
إجابة Wael Aljamal سؤال في كيفية الحصول على كل المستخدمين ماعدا المستخدم الحالي في لارافيل Laravel؟ كانت الإجابة المقبولة
يمكننا عمل الاستعلام بمساعدة دالة الاستثناء except ونمرر لها معرف المستخدم الحالي مثلا من الصنف Auth ليصبح كالتالي:
<?php $users = User::all()->except(Auth::id()); كما يوجد طرق أخرى مثل عمل إحدى الطريقتين:
نستعمل الدالة where ونمرر لها معاملات الشرط المناسبة مثل اسم العمود id و الشرط لا يساوي ثم رقم المستخدم الحالي <?php $users = User::where('id', '!=', auth()->id())->get(); $users = User::whereKeyNot(auth()->id)->get(); وفي حال أردت استثناء أكثر من مستخدم يمكنك تمرير مصفوفة بال ids للدالة except
<?php User::all()->except([1,2,3,4]);
-
إجابة Wael Aljamal سؤال في هل يمكن رفع تطبيق ios الى app store ابستور باستخدام ويندوز windows كانت الإجابة المقبولة
React هي مكتبة front end، فأعتقد أنك تقصد React Native
هل قمت ببناء التطبيق واستخراجه ل IOS بلاحقة IPA؟ ipa يمكنك بناء التطبيق ورفعه لمتجر app store فقط من خلال Xcode وهو غير متاح لويندوز (فقط متاح على نظام ماك mac os)
يمكنك تنصيب نظام وهمي ماكنتوش على vitrual machine على ويندوز و استخدام ماك من خلاله
هذه خطوات تنصيب ماك عن طريق البيئة الافتراضية
-
إجابة Wael Aljamal سؤال في ادراج صوره في مشروع ويب كانت الإجابة المقبولة
إن محرر الأكواد يوفر طريقة لكتابة الشيفرات البرمجية وإدارة ملفات المشروع.
إن كنت ترغب في ربط صورة مع صفحة HTML انقل ملف الصورة لنفس المكان (المجلد) الموجودة به ملف HTML ثم لعرض الصورة نستخدم الوسم img
<img src="picture.jpg" alt="صورة"> وتأكد من أن لاحقو الملف نفسها أي jpg أو png..
وأرجو توضيح المشكلة بشكل أكبر لأني افترضت أنها HTML لأنك السؤال ينقصه التفسير و التفاصيل
توثيق العنصر img موسوعة حسوب
-
إجابة Wael Aljamal سؤال في حل مشكلة PDOException could not find driver في PHP؟ كانت الإجابة المقبولة
يبدو أن الحزمة البرمجية الخاصة بمخدم PHP والاتصال مع mySQL غير مفعله، ويمكنك ذلك من خلال فتح ملف
php.ini وإلغاء تعليق السطر:
[PHP_PDO] extension=php_pdo.dll [PHP_PDO_MYSQL] extension=php_pdo_mysql.dll ويمكننا تثبيت حزمة PHP MySQL خاصة من خلال الأوامر:
sudo apt-get install php-mysql أو PHP5: sudo apt-get install php5-mysql PHP7: sudo apt-get install php7.0-mysql ثم نقوم بإعادة تشغيل مخدم الويب
Apache: sudo /etc/init.d/apache2 restart Nginx: sudo /etc/init.d/nginx restart
-
إجابة Wael Aljamal سؤال في سكراتش - Events ما الفرق بين broadcast بث رسالة و broadcast and wait بث رسالة وانتظار كانت الإجابة المقبولة
مرحبا حاتم،
يمكنك نشر تعيق أسفل الدرس لتتم المتابعة ضمن الدرس، وليعرف المدرب ما المعلومات التي تم شرحها ليقوم بتوضيحها.
وأرجو إرفاق رابط مشروعك مع السؤال في تعليق أسفل الدرس و السماح بمشاركته (سماح بفتح المشروع من الآخرين) ليستطيع المدرب تتبع البرنامج و إصلاح الأخطاء
نشر رسالة broadcast message تقوم بنقل التحكم إلى اللبنة البرمجية الهدف فقط. (نقل تسلسل تنفيذ البرنامج) أما broadcast and wait يقوم بنقل التحكم مؤقتاً للبنة برمجية أخرى وبعد انتهاء تنفيذها يعود لمتابعة اللبنة التي أطلقت الرسالة بعد إنتهاء التنفيذ لبنة الهدف -
إجابة Wael Aljamal سؤال في توجيه المستخدم لصفحة المنتج بعد النقر عليه HTML / jquery كانت الإجابة المقبولة
تبدأ هذه الفكرة من backend حيث يتم تمرير خاصية html مثل data-product-id=1234asfgv ضمن هيكلية هذا العنصر. ونقوم بإسناد معرف id العنصر لها، و في حال النقر على العنصر نقرأ product-id ومن ثم نقوم بعمل توجيه لصفحة خاصة بعرض المنتجات مع تمرير معرف العنصر ويمكن ذلك من خلال GET params مثلا، حيث أنه في المتحكم الخاص بعرض المنتجات نستعلم حسب id الممرر بعمل استعلام لقاعدة البيانات ثم نحقن البيانات في صفحة عرض النموذج.
كما يمكن ذلك من خلال AJAX نقرأ url الصفحة الخاصة بالمنتجات (عندما نكون داخلها) و نستخلص product-id ثم نجلب بياناته و نحدث الصفحة
-
إجابة Wael Aljamal سؤال في حدود رفع المشاريع على منصة heroku كانت الإجابة المقبولة
حسب موقعهم يمكن للحساب غير المتحقق (لم يتم توثيقه) منه unverified رفع حتى 5 مشاريع، أما الحسابات الموثقة حتى 100.
أكبر عدد من المشاريع المرفوعة
Maximum number of apps
Unverified accounts can create at most 5 apps. Verified accounts can create no more than 100 apps.
-
إجابة Wael Aljamal سؤال في لماذا تختلف أنماط العرض الافتراضية لعناصر CSS display كانت الإجابة المقبولة
لكل عنصر في HTML وظيفة نوعاً ما خاصة به، وبناءاً على ذلك سيكون له تنسيقات افتراضية ليكون تضمينه في حل المشكلة البرمجية سلس و سهل، كما تعلم أن العنصر p يعرض مقطع من النص paragraph ويكون فيه مجموعة مرتبطة من الجمل، و يتم عرضه مع سطر قبله فارغ و سطر بعده فارغ ليعطي انطباع أن هذا الجزء من النص مرتبط ببعضه ومستقل.
مهمة العنصر span هو تحديد كلمة أو أكثر ضمن نص ( على الأغلب ضمن p) مع إعطاء هذا النص مثلاً حجم خط مختلف أو لون مختلف أو أياً كانت التنسيقات، (أو عناصر أخرى). مع بقاءه مرتبط مع النص الموضوع فيه أي فقط لتمييز حزء من النص مثلاً.
لذلك نمط العرض الافتراضي ل p سيكون display:block أما النمط الخاص ب span هو display:inline
سؤال جيد يا محمد،
-
إجابة Wael Aljamal سؤال في طباعة عناصر مصفوفات متداخلة باستعمال array - foreach بلغة PHP كانت الإجابة المقبولة
قدمت إجابة لنفس السؤال باستخدام حلقة for عادية يمكنك الإطلاع عليها في نهاية الإجابة
حسب كيفية طباعة البيانات نرى أننا نريد رقم العنصر وهو ما يعرض بعد item أي: item #1 وهذا كان بطباعة قيمة عداد الحلقة i$ الذي يزيد مع كل تكرار..
إذا كانت مصفوفة PHP عادية ومفاتيحها أرقام، يمكننا الوصول لدليل العنصر عن طريق index مباشرة لأنه رقم، أما في حال مصفوفة ترابطية و دليلها نص، فلن تنفع.
foreach($array as $key=>$value) { echo $key; // 0 1 2 3 ... // do stuff } key سيحمل قيمة مفتاج العنصر أو ترقيمه في المصفوفة
Value ستحمل لكل تكرار قيمة العنصر الذي تكراره key والتي لدينا هي مصفوفة أخرى
<?php $class_array = .. foreach($class_array as $key=>$sub_array) { echo .. item key foreach($sub_array as $key=>$value) { echo ??? $value } } يمكننا تخصيص عداد مستقل ليساعدنا في ترقيم العناصر في حال مصفوفة فيها دليل index العنصر ليس رقم بالشكل:
<?php $index = 0; foreach($data as $key=>$val) { echo "Index is $index\n"; // طباعة العداد تعطينا رقم العنصر $index++; // لا ننسى زيادة قيمة العداد } و معلومة أخرى،
عند التكرار على مصفوفة سيتم إنشاء مؤشر داخلي فيها يمكن قراءة قيمته باستخدام دالة curreny التي تعيد رقم العنصر و نستفيد منه كما عداد الحلقة i$
foreach($array as $key => $value){ $index = current($array); // 0 1 2 3 }
-
إجابة Wael Aljamal سؤال في كيفية حقن العنصر بعد الانتقال الى صفحة اخرى HTML / jquery كانت الإجابة المقبولة
إن شيفرة جافاسكربت لا تملك القدرة على التعديل في صفحات أخرى، لذلك لن تعمل شيفرة موجودة في صفحة 1 ضمن الصفحة 2.
الطريقة الوحيدة للتحكم في صفحة ثانية هي فتح نافذة جديدة باستخدام window.open وحفظ مرجعية لها ومن خلال المتغير نستطيع التلاعب ب DOM لصفحة النافذة المفتوحة.
var myWindow = window.open("", "MsgWindow", "width=200,height=100"); myWindow.document.write("<p>This is 'MsgWindow'. I am 200px wide and 100px tall!</p>"); يمكنك حفظ المنتجات التي أضافها المستخدم لسلة التسوق في local storage مثلاً وبعد انتقاله للصفحة التالية تقوم بجلب بيانات المنتجات و عرضها في الصفحة.
يمكنك تخزين id المنتجات بعد النقر عليهم، وتخزينهم كمصفوفة، ثم بعد استعراض السلة، نطلب كامل بيانات المنتجات و الصور للصفحة حيث نقرأ ids ونستعلم منهم.
-
إجابة Wael Aljamal سؤال في طباعة مصفوفة بتنسيق معين PHP كانت الإجابة المقبولة
بشكل عام لدينا مصفوفة مصفوفات، ولكل مصفوفة للانتقال على عناصرها يتطلب ذلك حلقة،
و كما نرى أنه لدينا مصفوفات متداخلة فهذا يعني أننا بحاجة حلقات متداخلة لنتماشى مع بنية المعطيات.
<?php $class_array = .. for ($i=0; $i<count($ ?? ); $i++ ) { echo .. $sub_array = $class_array[ ?? ] for ($j=0; $j<count($ ?? ); $j++) { echo ??? } }
-
إجابة Wael Aljamal سؤال في تظهر صلاحية ملفات تعريف الارتباط cookies على أنها session عند التطبيق من خلال document.cookie javascript كانت الإجابة المقبولة
إن هذه هي مدة صلاحية ملفات تعريف الارتباط التي قمت بإنشائها، سوف تعمل فقط خلال الجلسة الحالية
وسبب ذلك هو عدم تعيين وقت افتراضي ل cookies فيتم التخلص منها مع إغلاق المتصفح أي ستكون متاحة فقط خلال الجلسة الحالية session هنا هي مدة صلاحية.
أي ربما الكائن exp لديك ليس بالصيغة السليمة فلم تتم قراءة الوقت بشكل صحيح فتم أخذ الافتراضي session cookie
حاول تمرير قيمة exp بالشكل:
expires=Fri, 31 Dec 9999 23:59:59 GMT; يمكنك تجريب الطريقة التالية أيضاً
function setCookie(cname, cvalue, exdays) { const d = new Date(); d.setTime(d.getTime() + (exdays * 24 * 60 * 60 * 1000)); // اليوم التالي let expires = "expires=" + d.toUTCString(); document.cookie = cname + "=" + cvalue + ";" + expires + ";"; } setCookie("username", 'wael', 1); // يوم واحد
-
إجابة Wael Aljamal سؤال في متى يجب استخدام interface ومتى يجب استخدام صنف مجرد abstract class في PHP؟ كانت الإجابة المقبولة
الواجهات و الأصناف المجردة مختلفات في بعض الجزئيات:
أنه لا يمكننا تعريف خواص properties ضمن الواجهات بينما في الأصناف يمكننا ذلك. جميع دوال الواجهات يجب أن تكون Public فيما دوال الأصناف المجردة من الممكن أن تكون public | protected جميع دوال الواجهات تكون Abstract أي لا يوجد جسم للدالة فقط تعريفها يمكن للواجهات الوراثة من أكثر من واجهة extends الأصناف يمكن أن تعمل implement لأكثر من واجهة و ترث صنف آخر واحد فقط لكل نقطة من السابق سنضيف مثال:
تعريف الخواص فقط ضمن الصنف المجرد <?php interface Animal { private sound = "Meow"; // خطأ public function makeSound(); } abstruct class Cat implements Animal { protected sound = "Meow"; // صحيح public function makeSound() { echo $this.sound; } }
دوال الواجهات عامة، أما الأصناف المجردة عامة أو محمية <?php interface Animal { public function makeSound(); ^^^^^^ إجبارية } abstruct class Cat implements Animal { protected sound = "Meow"; // صحيح public function makeSound1() { ^^^^^^ echo $this.sound; } protected function makeSound2() { ^^^^^^^^^ echo $this.sound; } }
نكتب الترويسة عند تعريف دالة في الواجهة و جسمها في الصنف <?php interface Animal { public function makeSound(); // ترويسة فقط } class Cat implements Animal { public function makeSound() { // تعريف كامل echo "Meow"; } }
الوراثة المتعددة في الواجهات تستعمل الكلمة المفتاحية extends أما الصنف يحقق واجهة implements <?php interface MyInterface1{ public function method1(); } interface MyInterface2{ public function method2(); } interface MyInterfaceName extends MyInterface1, MyInterface2{ } class MyClassName implements MyInterfaceName{ public function method1(){ echo "Method1 Called" . "\n"; } public function method2(){ echo "Method2 Called". "\n"; } } $obj = new MyClassName; $obj->method1(); $obj->method2(); ?>
يمكننا وراثة صنف واحد، وتطبيق عدة واجهات <?php // صنف عادي class A { public function insideA() { echo "I am in class A"; } } // واجهة interface B { public function insideB(); } // واجهة interface C { public function insideC(); } class D extends A implements B,C { function insideB() { echo "I am in interface B"; } function insideC() { echo "I am in interface C"; } public function insideD() { echo "I am in inherited class"; } } $hsoub = new D(); $hsoub->insideA(); $hsoub->insideB(); $hsoub->insideC(); $hsoub->insideD(); ?> // output I am in class A I am in interface B I am in interface C I am in inherited D
-
إجابة Wael Aljamal سؤال في هل يوجد أي مصادر تعلم أخرى غير الفيديوهات في الدورة؟ كانت الإجابة المقبولة
يوجد بالطبع، يمكنك متابعة توثيق لغة البرمجة التي تدرسها بالدورة من خلال موسوعة حسوب التي تحوي معظم توثيق اللغات، و ضمن تبويب دروس و مقالات ضمن أكاديمية حسوب حسب التصنيفات لكل تقنية و لغة.
ولا مشكلة بالطبع من قراءة التوثيق الأجنبي من المواقع الرسمية أو مشاهدة دروس خارجية لمواضيع معينة .. كما يمكنك نشر أسئلة ضمن الدروس أو هنا في الأسئلة العامة لأي فكرة تريد شرح إضافي لها. أنت حر في طريقة الدراسة التي ترغب بها.
موسوعة حسوب: wiki.hsoub.com
مقالات أكاديمية حسوب: academy.hsoub.com/programming
-
إجابة Wael Aljamal سؤال في ما هو نظام الامتحان لدورات أكاديمية حسوب؟ كانت الإجابة المقبولة
الامتحان عبارة عن جزئين رئيسيين:
محادثة صوتية مع مدرب لمدة نصف ساعة بناء مشروع التخرج يمكنك معرفة جميع معلومات الامتحان من خلال الرابط التالي:
امتحان دورات أكاديمية حسوب
-
إجابة Wael Aljamal سؤال في مشكلة في ال java عند تطبيق خوارزمية الفرز الفقاعي bubble sort كانت الإجابة المقبولة
لديك المشكلة أن المتغير i سيكون ثابت خلال تكرار الحلقة j وهذا يعني أنه سيقوم بعمل نفس الشرط بين أول عنصرين بدل أن يتحرك المؤشر.
لذلك نعدل ضمن الشرط و swap أن j المستخدم و ليس i
for (int i=0; i<arr.length; i++){ for (int j=0; j<arr.length-1-i; j++){ if (arr[j]> arr[j+1]){ swap(arr,j,j+1); } } } أرجو التجريب
-
إجابة Wael Aljamal سؤال في إنشاء دالة في cpp تعيد ناتج عملية حسابية بين معاملين كانت الإجابة المقبولة
الدالة سوف تستقبل 3 وسطاء هما الرقمين و الإشارة
void functionName(parameter1, parameter2, parameter3) { // code to be executed } حاول بنفسك إضافة الدالة لملف cpp قبل الدالة main مع تحديد اسمه و أنماط الوسطاء. ثم نختبر نوع الوسيط الثالث الخاص بالإشارة و نقوم بعمل عملية حسابية بين أول وسيطين استدعاء الدالة في main وطباعة النتيجة خارطة عامة تساعدك:
#include<iostream> void functionName(parameter1, parameter2, parameter3) { // code to be executed } int main() { cout << functionName(1,2,'+'); // 3 return 0; }
-
إجابة Wael Aljamal سؤال في لماذا لا يتوقف تنفيذ البرنامج بلغة c كانت الإجابة المقبولة
سبب عدم توقف البرنامج هو عدم تعديل قيمة n وبذلك لا تتوقف الحلقة.
يجب إعادة قراءة قيمة n في نهاية الحلقة ومن ثم سيتم اختبار قيمتها في بداية التكرار التالي
scanf("%d",&n); while(n !=0 ){ printf("\nEnter the amount:"); scanf("%d",&amount); if(amount < 50){ .. else { .. } // هنا printf("\nEnter 0 or -1 to Exit"); scanf("%d",&n); if(n==0) break; } }
-
إجابة Wael Aljamal سؤال في طباعة هل القيم موجبة أم سالبة باستخدام حلقة while والتوقف عند الحصول على القيمة -1 كانت الإجابة المقبولة
من فضلك إرفاق الشيفرات البرمجية كنص وليس كصورة
أول شرط حسب فهمنا السؤال هو التوقف عند قراءة عدد -1 لذلك نضع هذا الأمر في شرط while
while(n != -1) { //.. } طالما دخلنا للحلقة فإن قيمة قراءة n ليس -1 لذلك نختبر هل هو زوجي أم فردي
while(n != -1) { if ( n % 2 == ...) { // زوجي مثلاً } if () { // فردي } } نطبع عبارة زوجي أو فردي ضمن الشرط
و نعود لقراءة قيمة n الجديد في نهاية الحلقة ليتم اختباره من جديد في التكرار التالي.
-
إجابة Wael Aljamal سؤال في شرح عمل حلقة for كانت الإجابة المقبولة
تستخدم حلقة for لعمل عدد محدد من التكرارات، مثل التكرار على مجال من الأرقام مثل 1 إلى 10 أي من نقطة بداية إلى نقطة نهاية محددة، أو بالمرور على مصفوفات لأن لها طول ثابت.
تنقسم حلقة for ل 3 أجزاء رئيسية:
أول جزء يتم تنفيذه مرة واحدة وفيه يتم تعريف متغير الحلقة ثاني جزء نضع فيه الشرط الذي نختبره لكل تكرار للتحقق هل مازال الشرط محقق فتستمر الحلقة لتكرار جديد ويتم اختبار الشرط قبل تنفيذ ما بداخل الحلقة الجزء الثالث يتم تنفيذه بعد إنتهاء تنفيذ جسم الحلقة لكل تكرار وفيه نزيد عداد الحلقة أي نجعله يتغير وينتقل على المجال بين البداية و النهاية، وفي حال التعامل مع مصفوفة سينقل للعنصر التالي أول تعليمة برمجية نكتبها بعد حلقة for يرتبط تنفيذها بتكرار الحلقة (لكل تكرار سيتم تنفيذ أبناء الحلقة) وفي حال كان لدينا أكثر من تعليمة برمجة تنفيذهم مرتبط بالحلقة نضعهم ضمن أقواس المجموعة { }
لاحظ في الشيفرة، 1 تم فيه تعريف متغير الحلقة اسمه i مع قيمة ابتدائية 1 (start)
الجزء 2 هو شرط تكرار الحلقة ويضمن تحرك (تغير قيمة i) ضمن المجال أصغر أو يساوي 5
الجزء 3 يضمن زيادة عداد الحلقة بقيمة 1 بعد الانتهاء من تنفيذ جسم الحلقة (في مثالنا تعليمة الطباعة)
for (let i = 1; i <= 5; i++){ // 1 2 3 // تعليمة برمجة يرتبط تنفيذها بتكرار الحلقة console.log(i) } يمكن توسيع الحلقة لتبسيطها بالشكل التالي:
let i = start loop: // بداية جسم الحلقة if (i <= 5) { // شرط الاستمرار console.log(i) // اطبع قيمة العداد الحالية i = i + 1 } else break // توقف end loop: نهاية جسم الحلقة يمكنك قراءة: for في JavaScript من موسوعة حسوب
-
إجابة Wael Aljamal سؤال في ما هو ملف نورمليز normalize css كانت الإجابة المقبولة
مكتبة normalize التابعة لتقنية CSS هي مكتبة تستخدم في تطوير واجهات المستخدم Front End
حسب تعريفها في الموقع الرسمي normalize.css
هي تقوم بعمل CSS reset (إعادة إعداد - توحيد قيم خصائص التنسيقات) أي مثل تخلص المتصفحات من التنسيقات الافتراضية التي تقوم بتطبيقها تلقائياً على عناصر HTML مما يفيد في التأكد من أن الموقع الخاص بنا سيتم عرضه بنفس الطريقة بالضبط على مختلف المتصفحات. ويُستخدم عادةً لتسوية المتصفحات على سوية واحدة
يمكنك الاطلاع على مقارنة بينها و بين مكتبة قديمة حلت محلها من خلال المقالة:
-
إجابة Wael Aljamal سؤال في ماذا أدرس أولا؟ هل أدرس react.js أو Node.js بعد اكتمال دراسة اساسيات لغة الجافاسكريبت كانت الإجابة المقبولة
من الأفضل السير بنفس ترتيب الدورة، والبدء مع react.js حيث أن بعد هذا المسار سوف يصبح لديك فكرة جيدة عن كيفية عمل react.js في المتصفح، أما مسار Node فيه مشروع عبارة عن مدونة وهذه كواجهات أمامية معمولة عن طريق react.js.
غالباً نبدأ بالواجهات الأمامية لأنها أسهل و فيها رسوميات و عناصر تفاعلية تظهر في الشاشة فنحبذ دراستها أولاً ثم لاحقاً نقوم بتطوير منطق التحكم بتدفق البيانات فيها و باقي الأمور.
بالتوفيق
-
إجابة Wael Aljamal سؤال في اريد ان استخدم علامة التسلسل الاختياري Optional chaining بطريقة صحيحة فى الجافا سكريبت JavaScript باستعمال رمز الاستفهام "؟" كانت الإجابة المقبولة
تدعى هذه الخاصية بالتسلسل الاختياري Optional chaining ولطن الخطأ لديك ليس بسببها على ما أظن، تأكد من بنية المتغيرات لديك هل هو كائن صحيح به الخاصيات أم كلا.
الشكل العام للخاصية:
obj.val?.prop obj.val?.[expr] obj.arr?.[index] obj.func?.(args) تعمل الخاصية على ضمان عدم ظهور خطأ عند طلبي خاصية فرعية من خاصية أخرى ضمن غرض برمجي يمكن لأحد القيم فيه أن تكون null فنتجنب حدوث خطأ.
let user = {}; // تحدث للمستخدم user في حالة كان ليس لديه عنوان alert(user.address.street); // خطأ! // بعد القليل من المعالجة المنطقة تصبح: let user = {}; // إذا كان user لا يملك عنوان alert( user && user.address && user.address.street ); // undefined (أي ليس خطأً) // ثم تم إضافة Optional chaining let user = {}; // إذا كان user لا يملك عنوان alert( user?.address?.street ); // undefined (ليس خطأً) يمكنك قراءة المقالة: