اذهب إلى المحتوى

Hassan Hedr

الأعضاء
  • المساهمات

    2846
  • تاريخ الانضمام

  • تاريخ آخر زيارة

  • عدد الأيام التي تصدر بها

    38

إجابات الأسئلة

  1. إجابة Hassan Hedr سؤال في ظهور الخطأ possible EventEmitter memory leak detected في node.js كانت الإجابة المقبولة   
    التحذير موجود لتنبيهك قد لا تكون بحاجة لزيادة الحد الأقصى بل للانتباه لماذا يضاف الكثير من ال listeners الى مصدر الأحداث لديك،
    قد يكون في نظامك مكان تريد الاستماع فيه الى حدث معين أو خطأ لنفس الحدث لكنك لا تزيل الدوال الممررة والمنتهي عملها
    stream.on('data', onData) stream.on('error', onError) stream.on('end', cleanup) // التنظيف عند الانتهاء أيضا // توابع معالجة البيانات و الأخطاء // يمكن الإشارة اليها لاحقا لتنظيفها حال الانتهاء function onData() { cleanup() // .. } function onError(err) { cleanup() // .. } function cleanup() { // إزالة كل التوابع التي أضفناها سابقا لتجنب تسريب الذاكرة stream.removeListener('data', onData) stream.removeListener('error', onerror) stream.removeListener('end', cleanup) } أما في حال كنت متأكد من العدد التقريبي للدوال التي ستستمع للأحداث يمكنك زيادتها كي يكون التنبيه ذا فائدة حين يتكرر
     
    stream.setMaxListeners(20)  
  2. إجابة Hassan Hedr سؤال في ما الفرق بين localStorage و sessionStorage في JavaScript؟ كانت الإجابة المقبولة   
    كلاهما مخزنين يستخدمان لتخزين أي بيانات خاصة بنطاق معين، الفرق هو عمر صلاحية هذه البيانات:
    sessionStorage: تخزن البيانات فقط للتبويب الذي تم داخله حفظ البيانات في هذا المخزن، وعند اغلاق التبويب (أي انتهاء جلسة المستخدم) يتم حذف جميع البيانات localStorage: تخزن البيانات دائما ولا يتم حذفها إلا باستدعاء الأمر removeItem، ويمكن الوصول اليها في وقت لاحق حتى لو تم إغلاق صفحة الموقع // localStorage localStorage.setItem('name', 'خالد'); // بعد إغلاق وفتح المستخدم لصفحة الموقع localStorage.getItem('name'); // 'خالد' // sessionStorage sessionStorage.setItem('name', 'خالد'); // بعد إغلاق وفتح المستخدم لصفحة الموقع sessionStorage.getItem('name'); // null  
  3. إجابة Hassan Hedr سؤال في كيفية التنسيق التلقائي للأعمدة باستخدام grid-template-columns في CSS كانت الإجابة المقبولة   
    قيمة grid-template-columns تحدد نمط تنسيق الأعمدة في الشبكة
    القيمة repeat(auto-fill, minmax(450px, 1fr)) توصف:
    ()repeat تكرار لنمط معين عدد من المرات، نمرر عدد مرات التكرار ثم القياس عدد مرات التكرار: auto-fill يعني أن نقوم بتكرار القياس اللاحق ليس بعدد ثابت من المرات وانما يكرر بأقصى عدد ممكن لملئ المساحة الأفقية القياس: ()minmax تحدد الحد الأدنى والأعلى للقياس الحد الأدنى: 450px أي لن ينقص عرض العمود الواحد عن 450 بيكسل الحد الأعلى: 1fr أي لا يوجد حد أعلى لعرض العمود يمكن للعمود ملئ كافة المساحة المتبقية الناتج يكون عدد أعمدة تلقائي متناسق مع الأجهزة كافة بحيث كلما استطعنا وضع أعمدة بأقل عرض ممكن 450px يضاف عمود جديد يملئ المساحة المتوفرة 
  4. إجابة Hassan Hedr سؤال في كيف يستفيد أصحاب المواقع والبرامج الكبيرة المجانية كانت الإجابة المقبولة   
    ليس هناك فائدة ربحية مباشرة من مثل هذه المشاريع المجانية،
    فهي تكون عادة جزء من عدة مشاريع تمتلكها الشركة وفائدتها تقع ضمن الاستراتيجية العامة للشركة لذلك تستثمر فيها الشركة وتقدمها بالمجان، وأحيانا فقط تكون تطوعية خيرية
    موسوعة حسوب مرجع للمطورين باللغة العربية، الفائدة هي اغناء لغة التخاطب بين المطورين العرب وتسهيل الفهم لشريحة أكبر من المبرمجين لكي يستطيعو الدخول في سوق العمل التي تعمل ضمنه شركة حسوب VSCode أداة مفيدة للمطورين ترفع من انتاجيتهم وبالتالي اغناء السوق البرمجي التي تعمل ضمنه Microsoft
  5. إجابة Hassan Hedr سؤال في الحصول على معلومات نظام التشغيل من خلال node.js كانت الإجابة المقبولة   
    يمكن معرفة نظام التشغيل الحالي عن طريق اختبار قيمة المتحول
    process.platform فهو يأخذ القيم التالية
    win32: في حال كان النظام Windows darwin: في حال كان النظام MacOS linux: في حال كان النظام Linux مثال لتنفيذ عملية ما فقط على نظام التشغيل ويندوز
    if(process.platform === "win32"){ // أوامر تنفذ فقط على نظام ويندوز }  
  6. إجابة Hassan Hedr سؤال في كيفية تشغيل node.js في الخلفية دون استخدام حزم إضافية كانت الإجابة المقبولة   
    إن تنفيذ أي برنامج يعني عمله ضمن إجرائية معينة يقوم نظام التشغيل بتحديد الموارد المتاحة لها وإدارة دورة حياتها،
    ويمكن لأي اجرائية تنفيذ برامج أخرى وسيقوم نظام التشغيل بتنفيذ البرنامج ضمن إجرائية جديدة تكون إبنًا للإجرائية التي استدعت تنفيذ البرنامج
    دورة حياة الإجرائية الإبن مرتبطة بالإجرائية التي نشأت منها أي بإغلاق الإجرائية الأب ينتهي عمل الإجرائيات الأبناء  
    الطرفية terminal بحد ذاتها تعمل ضمن إجرائية وعند تنفيذك اي أمر داخلها (npm start مثلا) سيولد اجرائية إبن يعمل ضمنها تطبيقك لذلك عند إغلاقك للطرفية ينتهي عمل تطبيقك فورا
    أحد الحلول هو استخدام برامج مثل pm2 حيث يتم تشغيله كإجرائية مستقلة وبإعطاء الأوامر له بالتشغيل والمراقبة يدير كافة الإجرائيات ويبقيها تعمل دوما (فهو غير مرتبط بالطرفية نستخدم الطرفية فقط للتواصل وارسال الأوامر)
    الحل الوحيد هو تنفيذ مشروعك كإجرائية مستقلة مرتبطة مباشرة بنظام التشغيل أو ما يعرف بالخدمات، تكتب مواصفات الخدمة في ملف myapp.service داخل المسار /etc/systemd/system
    [Unit] # اسم لتطبيقك لتسهل إدارته Description=My app [Service] # ملف بداية التنفيذ ExecStart=/var/www/myapp/app.js Restart=always User=nobody Group=nobody # متحولات البيئة Environment=PATH=/usr/bin:/usr/local/bin Environment=NODE_ENV=production # مسار العمل كما لو أنك تنفذ الأمر من الطرفية عند هذا المسار WorkingDirectory=/var/www/myapp [Install] WantedBy=multi-user.target   ملاحظة: ملف بداية التنفيذ يجب أن يبدأ بالسطر التالي لنحددبرنامج البيئة الذي سينفذ الملف وهو node في حالتنا
    #!/usr/bin/env node تنفذ الأمر التالي ليقوم نظام التشغيل باستكشاف الخدمة الجديدة
    systemctl daemon-reload وتبدأ عمل الخدمة عبر الأمر التالي حيث myapp هو اسم ملف إعدادات الخدمة بدون اللاحقة
    systemctl start myapp وفي حال أردت تشغيل هذه الخدمة تلقائيا عند إقلاع الخادم نفذ الأمر
    systemctl enable myapp  
  7. إجابة Hassan Hedr سؤال في اكتشاف الحزم والمكتبات القديمة وتحديثها في node.js كانت الإجابة المقبولة   
    يمكنك تنفيذ الأمر التالي والذي سيقوم بمقارنة اصدارات كافة الحزم في مشروعك والبحث عن الاصدارات الجديدة
    npm outdated  الخرج يكون جدول بتقرير بكافة الحزم الممكن تحديثها حيث
    Current : النسخة المنصبة الحالية في المشروع Wanted : هي النسخة التي يمكن التحديث اليها Latest : وهي أخر نسخة متوفرة من الحزمة (لا يتم التحديث لها مباشرة قبل مراجعة تغييرات النسخة واستخدام تطبيقك لها) مثال عن التقرير
     
    Package Current Wanted Latest Location Depended by glob 5.0.15 5.0.15 6.0.1 node_modules/glob dependent-package-name nothingness 0.0.3 git git node_modules/nothingness dependent-package-name npm 3.5.1 3.5.2 3.5.1 node_modules/npm dependent-package-name local-dev 0.0.3 linked linked local-dev dependent-package-name once 1.3.2 1.3.3 1.3.3 node_modules/once dependent-package-name  
    بعد معرفة الحزم المراد تحديثها يمكن تحديث الكل عبر تنفيذ الأمر
    npm update أو تحديد مع حزمة معينة مثال 
    npm update glob  ويمكن تحديد نسخة معينة تريد التحديث إليها
    npm update glob@6.0.1  
  8. إجابة Hassan Hedr سؤال في هل أستطيع عمل أكثر من أمر باستعلام واحد في postgresql كانت الإجابة المقبولة   
    نعم هذا في حال عملية الاستعلام لا يوجد بها منطق مثل الخطوة رقم 2، عمليات المنطق (التحقق من البيانات) نقوم بها في لغة البرمجة حصرا يمكنك معرفة الخطأ من رسالة الخطأ أو تحديده من المعرف الخاص به (23505 لخاصية ال unique_violation) لتنفيذ عدة عمليات معا اذا كنت تستخدم مكتبة pg مباشرة كالتالي const { Pool } = require("pg"); const pool = new Pool(); pool.connect((err, client, done) => { const shouldAbort = (err) => { if (err) { console.error("Error in transaction", err.stack); // التراجع عن تنفيذ العمليات client.query("ROLLBACK", (err) => { if (err) { console.error("Error rolling back client", err.stack); } // release the client back to the pool done(); }); } return !!err; }; client.query("BEGIN", (err) => { if (shouldAbort(err)) return; // بداية العمليات // INERT..., UPDATE... // نهاية العمليات client.query("COMMIT", (err) => { if (err) console.error("Error committing transaction", err.stack); done(); }); }); });  
    اذا كنت تستخدم sequelize فالأمر أبسط
    try { const result = await sequelize.transaction(async (t) => { // نقوم بالعمليات هنا // مع تمرير الخاصية transaction // مثال const user = await User.create({ name: 'Modhy', }, { transaction: t }); //... }); // الوصول إلى هنا يعني اتمام العمليات بنجاح } catch (error) { // أي خطأ يحدث خلال العمليات يتم التراجع عنه آليا والحصول على الخطأ }  
  9. إجابة Hassan Hedr سؤال في ما المقصود بال normalization في قواعد البيانات كانت الإجابة المقبولة   
    عند تشكيل جداول البيانات بأبسط شكل نبدأ بوضع كل البيانات في جدول واحد، مثال جدول الموظفين وكل موظف يتبع لقسم يخطط الجدول كالتالي
    جدول الموظفين: employee | department | department_number ------------------------------------------------------------------- khaled | department 1 | 575 ahmad | department 2 | 322 mohammad | department 1 | 575 Hasan | department 3 | 446 نلاحظ تكرار بعض القيم في حقل اسم القسم هذا يخلق بعض المشاكل
    زيادة حجم قاعدة البيانات مع الوقت عند تحديث أو حذف قيمة (اسم القسم مثلا) يجب التأكد تغيير كل تكرارات هذه القيمة كل المعلومات الاخرى المتعلقة بالقسم (رقم القسم) يجب تكرارها بشكل صحيح في كل مرة نضيف موظف جديد     لتجنب هذه المشاكل نقوم بعملية تسمى normalization وهي فصل القيم المكررة الى جدول منفصل وربطها بالجدول الأساسي فيصبح لدينا جدول للموظفين وجدول للأقسام وبياناتها
    جدول الموظفين: employee | department_id ---------------------------------------- khaled | 1 ahmad | 2 mohammad | 1 Hasan | 3 جدول الأقسام: id | department | department_number ----------------------------------------------------------- 1 | department 1 | 575 2 | department 2 | 322 3 | department 3 | 446  
  10. إجابة Hassan Hedr سؤال في ظهور الخطأ Deprecated Gradle features were used in this build ريآكت ناتيف كانت الإجابة المقبولة   
    هناك مزايا لم يعد يستخدمها Gradle 7 تقوم باستخدامها داخل مشروعك (أو أحد الحزم المستخدمة من قبل مشروعك) حاول تنفيذ الأمر التالي:
    cd android && ./gradlew clean && ./gradlew :app:bundleRelease اذا بقيت المشكلة من فضلك قم بارفاق محتويات ملف "Android/app/build.gradle"
  11. إجابة Hassan Hedr سؤال في ما فائدة الـvalues في حقول الإدخال الـinputs في جافاسكريبت كانت الإجابة المقبولة   
    ما هي الخاصية value ؟
    في لغة HTML لكل عنصر خصائص يمكنك تعيينها،
    العنصر input هو عنصر لادخال البيانات لديه الخاصية value وهي تعبر عن القيمة البيانات التي يمثلها العنصر
    يمكن الاستفادة من تعيين قيمة هذه الخاصية أن يكون للعنصر قيمة افتراضية وليس فارغا
    <!-- عنصر ادخال بيانات الاسم مع قيمة افتراضية --> <input name="name" value="mohammad /> عندما يغير المستخدم قيمة الحقل داخل المتصفح ستتغير قيمة الخاصية value.
    كيف ارسل قيمة العنصر الى قاعدة البيانات ؟
    تقوم بإحاطة العنصر بعنصر form وهو مسؤول عن تحديد وجهة البيانات داخله، مع عنصر button لتاكيد الإرسال
    <!-- عنصر لتحديد اين تريد إرسال البيانات داخله --> <form method="POST" action="/path/to/action"> <input name="name" value="mohammad /> <button>إرسال</button> </form> عند الضغط على الزر سترسل البيانات إلى الوجهة المحددة عبر ارسال طلب HTTP يحتوي على الخاصية name بالقيمة "mohammad". 
    تقوم على الخادم باستلام هذا الطلب واستخراج قيمة name منه ووضعه بقاعدة البيانات.
  12. إجابة Hassan Hedr سؤال في ماهو hadoop كانت الإجابة المقبولة   
    Apache Hadoop هو مجموعة من الأدوات مفتوحة المصدر مهمتها الأساسية إدارة وتخزين ومعالجة مجموعة بيانات كبيرة (جيجابايت - اكسابايت)
    تستخدم مجموعة الأدوات (المكونات الأساسية) هذه عندما يكون لديك بيانات حجمها كبير وموزعة على عدة خوادم،
    تستطيع من خلالها إدارة كل البيانات بكفاءة وتنفيذ الاجرائيات كما لو كنت تنفذ الاجرائية على مخدم واحد
  13. إجابة Hassan Hedr سؤال في كيف يمكن الوصول إلى لغة المتصفح من خلال express.js؟ كانت الإجابة المقبولة   
    البروتوكول المتبع للتواصل بين الخادم والعميل (المتصفح) هو HTTP،
    بنية الطلب تتضمن إمكانية اضافة معلومات حول اللغات الذي يستطيع قبولها (يتقنها) العميل عبر قيمة تسمى Accept-Language، قيمتها تعبر عن لغة أو عدة لغات يفضلها العميل (تعين افتراضيا من قبل المتصفح حسب لغة جهاز العميل مثلا) 
    Accept-Language: * // العميل يقبل أي لغة Accept-Language: ar, en // العميل يفضل العربية ثم الانجليزية بالترتيب على الخادم يمكنك معرفة قبول العميل لأحد اللغات عبر الدالة acceptsLanguages
    app.use(function(request, response, next) { var lang = request.acceptsLanguages('ar'); // يعيد قيمة اللغة اذا كان يقبلها العميل // lang = 'ar' // يمكنك الان التصرف حسب قيمة اللغة المقبولة ... });  
  14. إجابة Hassan Hedr سؤال في ما الفرق بين express-session و cookie-session في node.js؟ كانت الإجابة المقبولة   
    الحاجة الأساسية التي تلبيها هذه الحزم هي تمييز طلبات المستخدم الواحد من الطلبات القادمة وتخزين واسترداد معلومات عنه.
    ما الفرق بين الحزمتين ؟
     express-session (بيانات الجلسة بطرف الخادم) يقوم بتخزين البيانات على الخادم (يوجد عدة تضمينات للمخازن حسب نوع المخزن)، ويمرر للعميل فقط معرف يستخدمه لاسترداد معلومات العميل في كل مرة يقوم فيها بطلب   cookie-session  (بيانات الجلسة بطرف العميل) يقوم بارسال البيانات كاملة للصاحب الطلب ولا يتم تخزين أي بيانات على الخادم. متى تستخدم كل منهما ؟
    cookie-session إذا كنت لا تريد متابعة وتطوير مكان التخزين بيانات الجلسة  cookie-session إذا كانت بيانات الجلسة خفيفة وحجمها صغير cookie-session إذا كانت لديك بنية خوادم متعددة لا تشترك بمكان تخزين موحد express-session خلاف ذلك أو إذا كان لديك طريقة تخزين مخصصة تفضل استخدامها لبيانات الجسلة
  15. إجابة Hassan Hedr سؤال في تعلم مهارة البحث ضمن google كانت الإجابة المقبولة   
    مهارة البحث تصقل بالتدريب، لا يقتصر الأمر على محرك البحث Google فمع كثرة البحث ستتعلم كل نوع من المعلومات أين وكيف تبحث عنه
    مثال المشاكل البرمجية لن تبحث عن حلها في Youtube بل بداية تبدأ من Google نهاية إلى نشر سؤالك على الأكاديمية هنا مثلا
    قد تتعلم بعض تقنيات البحث مثل 
    ضع اشارتي اقتباس" " على الكلمة التي تبحث عنها بحرفيتها وضع اشارة سالب - وبعدها موضوع لا تريده الظهور في نتائج البحث وضع الكلمة insite وبعدها نقطتان : ثم موقع حصري تريد البحث فيه هذه تقنيات للبحث يمكن أن تتعلمها من دورة أو السؤال، لكن صلب البحث هو التمرين ومواجهة المشاكل ومحاولة البحث عنها ستجد نفسك بعد فترة أسرع في جلب وإيجاد المعلومة  
  16. إجابة Hassan Hedr سؤال في منع العميل من مشاركة السورس كود الخاص بلارافل كانت الإجابة المقبولة   
    بعض لغات البرمجة كـ C تمر بمرحلة تحويل من الشيفرة المصدرية إلى لغة الآلة وينتج ملفات مكتوبة بلغة الآلة يمكن تنفيذها مباشرة، من يريد تنفيذ البرنامج فقط يحتاج للوصول الى البرنامج التنفيذي المكتوب بلغة الآلة وتنفيذه مباشرة ويمكنك ابقاء الشيفرة المصدر لديك دون مشاركتها
    هذه اللغات تسمى Compiled Languages
     يقابلها لغات أخرى مثل PHP, Python, Javascript لا تترجم وانما يقوم المفسر الخاص باللغة (Interpreter) عند التنفيذ بالمرور على الشيفرة المصدرية سطر سطر وتنفيذها، أي من يحتاج لتنفيذ البرنامج (في حالتك العميل) سيحتاج للوصول للشيفرة المصدرية حتى يتمكن من تنفيذها
    هذه اللغات تسمى Interpreted Languages
    الحلول المقترحة في حالتك:
    الحماية القانونية إن أمكن بكتابة عقد مع العميل بمنع البيع او النسخ أو الإفصاح عن الشيفرة المصدرية للنظام (حماية ممتازة إن توفرت) قم بتمويه الشيفرة المصدرية قبل تسليمها للعميل ما أمكن أي جعلها غير قابلة للقراءة بالاستعانة بمموه (حماية متوسطة) استئجار استضافة على حسابك الشخصي وتنصيب النظام عليها وتوفير الوصول للعميل فقط الى الواجهة الأمامية للموقع أو أي خدمات يستفيد منها (حماية ممتازة)
  17. إجابة Hassan Hedr سؤال في لدي مشكلة في TSX كانت الإجابة المقبولة   
    المشكلة تكمن في العبارة التالية
     استخراج نوع المتحول Layout من الغرض layouts، المفتاح يجب أن من النوع نص
    const key: string = "..." // مفتاح من النوع نص layouts[key] // صحيح const key: any = ... // مفتاح من نوع غير محدد layouts[key] // خطأ يمكن تصحيح الخطأ بالتصريح عن نوع المتحول layout داخل المكون Component بالنوع string
  18. إجابة Hassan Hedr سؤال في ما هو ال persistStore, persistReducer فى ريأكت ناتيف ريدكس كانت الإجابة المقبولة   
    باستخدامك لمكتبة Redux لإدارة الحالة داخل تطبيقك تنشئ عادة مخزن store وهو مخزن يعبر عن حالة التطبيق الحالية،
    هذا المخزن ليس إلا متحول عادي يخزن في الذاكرة العشوائية RAM عند عمل التطبيق ويتم حذفه من الذاكرة عند انتهاء عمل التطبيق
    مكتبة redux-persist تمكنك من تخزين حالة التطبيق في الذاكرة الدائمة واستعادتها عند بدء التطبيق
     كلمة persist تعني هنا الإبقاء أو الحفظ
    دالة مسؤولة عن تحديد مكان تخزين كل قطعة من بنية الحالة من مخزنك وتمييزها بمفتاح معين، عادة تقوم بتخزين المخزن ككل في قطعة واحدة كما التالي
    import { persistStore, persistReducer } from 'redux-persist' import storage from 'redux-persist/lib/storage' import rootReducer from './reducers' const persistConfig = { key: 'root', // مفتاح للتمييز storage, // مكان التخزين } const persistedReducer = persistReducer(persistConfig, rootReducer) تعني حفظ المخزن وهي دالة مسؤولة عن حفظ المخزن واستعادته عند بدء التطبيق
    // مخزن عادي يخزن في الذاكرة let store = createStore(persistedReducer) // تعزيز المخزن العادي بحفظه واستعادته let persistor = persistStore(store) const App = () => { return ( <Provider store={store}> /* نمرر المخزن المعزز */ <PersistGate loading={null} persistor={persistor}> ...  
  19. إجابة Hassan Hedr سؤال في هل مكتبة csurf تقوم بمقارنة التوكن القادم من المستخدم بالذي تم ارساله لها كانت الإجابة المقبولة   
    تقوم المكتبة بإنشاء وإرسال التوكن للزبون وعند إرسال الزبون لطلب يجب ان يحتوي على التوكن المرسلة من المخدم، وتقوم المكتبة بالتحقق منها هل هي مولدة من مخدمك أم لا (دون الحاجة لتخزين واسترداد أي توكن) بما انك تستخدم SPA يمكنك ارسال اتوكن مع ال Cookie للمتصفح عندما يطلب الموقع، وبذلك سيقوم المتصفح بارسال كل ال Cookie التي استلمها مع كل طلب يقوم به تلقائيا بدون الحاجة لأن تبرمج ذلك يدويا كالتالي  app.all('*', function (req, res) { res.cookie('XSRF-TOKEN', req.csrfToken()) // تعيين التوكن في الـ Cookie ... // نقوم الآن بإرسال ملفات الموقع })  
    يمكنك تعديل خصائص ال Cookie بتمرير غرض عوضًا عن true كالتالي csrf({ cookie: { key: '...', //اسم ال Cookie httpOnly: true, // تفعيل httpOnly } })  
  20. إجابة Hassan Hedr سؤال في No podspec found for `react-native-image-picker` in `../node_modules/react-native-image-picker` كانت الإجابة المقبولة   
    تأكد من وجود الملف "react-native-image-picker.podspec" داخل المسار "node_modules/react-native-image-picker" اذا لم يكن موجودا جرب حذف ملف node_modules مع ملف package-lock.json وأعد التنصيب بالأمر "npm install" ,ثم تأكد من وجود الملف مرة أخرى
  21. إجابة Hassan Hedr سؤال في ترجمة المشروع لا تتم بشكل كامل لارافل كانت الإجابة المقبولة   
    تأكد أن الحقل language موجود في مصفوفة الـ fillable داخل صف ال User كما يلي
    class User extends Model { protected $fillable = ['language', ...]; ... }  
  22. إجابة Hassan Hedr سؤال في كيف اعالج هده المشكلة ERROR Invariant Violation: Changing onViewableItemsChanged on the fly is not supported كانت الإجابة المقبولة   
    يبدو ان التابع onViewableItemsChanged الذي تمرره للمكون غير ثابت ويعاد تعريفه في كل مرة يتم استدعاء المكون
    const onViewableItemsChanged = function() {...} // يعاد تعريف التابع في كل مرة يجب تمرير تابع بمؤشر ثابت، يمكنك استخدام useCallback لهذا الغرض حيث يتم تعريف التابع فقط اول مرة يستدعى المكون
    // تابع يعرف بالمرة الأولى فقط const onViewableItemsChanged = useCallback((viewableItems) => { // يستدعى التابع هنا عند تغير العناصر المرئية },[]);  
  23. إجابة Hassan Hedr سؤال في كيف أقوم بجلب ال index من ال flat list كانت الإجابة المقبولة   
    اذا كنت تقصد العناصر وليس العنصر المرئية حاليا يمكنك استخدام onViewableItemsChanged
    ويمكنك معرفة العناصر مباشرة وليس فقط مؤشراتها
    <Animated2.FlatList horizontal data={ads} keyExtractor={item => item.id.toString()} onViewableItemsChanged={({ viewableItems }) => { // مصفوفة مؤشرات العناصر المرئية حاليا const viewableItemsIndices = viewableItems.map(item => item.index); // مصفوفة العناصر المرئية حاليا const viewableItems = viewableItems.map(item => item.item); // يمكنك الان استخدامها حسب حاجتك }} style={{backgroundColor: 'red'}} contentContainerStyle={{justifyContent: 'center'}} onScrollEndDrag={() => goToSelectedLocation(selectedIndex)} renderItem={({item, index}) => { setSelectedIndex(index); console.log(index); return ( <MapCard onPress={() => goToSelectedLocation(index)} style={{margin: 4}} title={item.title} image={item.image} price={item.price} />  
  24. إجابة Hassan Hedr سؤال في كيفية اختيار مكان من mapview فى react native كانت الإجابة المقبولة   
    لمعرفة الاحداثيات عند مكان ضغط المستخدم يمكنك الاستفادة من التابع onPress كما يلي
    <MapView style={{flex: 1}} onPress={({ coordinate, position}) => { const {latitude, longitude} = coordinate // الان اصبح لديك الاحداثيات التي تم الضغط عليها }}> </MapView> لمعرفة وجود مكان مميز عند تلك الاحداثيات، يجب الاستعلام عن ذلك من مزود معلومات الاماكن المميزة حسب تطبيقك :
    اما من بيانات الاماكن المميزة التي يوفرها تطبيقك (في قاعدة البيانات لديك مثلا) أو الاستفادة بالاشتراك بمزود معلومات خرائط طرف ثالث مثل Google Maps
×
×
  • أضف...