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

مشكلة في التعامل مع local storage في جافاسكريبت

منتصر احمد

السؤال

Recommended Posts

  • 0

يمكنك ذكر الأجزاء التي تحدث فيها مشاكل مع كتابة رسائل الخطأ التي تواجهك وذلك سيساعدنا أكثر على الإجابة على سؤالك.

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

من بعض الملاحظات التي وجدتها هي أنك قمت بتعريف متغيّر arrayOfTasks في بداية الشيفرة البرمجية باستخدام let، ومع ذلك تقوم بإعادة تعريفه من جديد ضمن التوابع، وهذا خطأ كون المتغيّر مسؤول عن التعامل مع البيانات في local storage:

let arrayOfTasks;


function getArrayOfTasksFromLocalStorageAndReturnItInDom() {

  let arrayOfTasks = JSON.parse(localStorage.getItem("arrayOfTasks"));

  arrayOfTasks.forEach((task) => {
    let div = document.createElement("div");
    div.className = "task";
    div.appendChild(document.createTextNode(task.title));
    tasksDiv.prepend(div);
  });
}

يمكنك استخدام var في بداية الملف والوصول إلى المتغيّر ضمن التوابع لاحقاً.

كما لاحظت أنه عند تحميل الصفحة لا يتم استعادة البيانات مع العلم أنها محفوظة ضمن local storage، لذلك يمكنك تغيير الكود الموجود هنا ليصبح كالتالي:

if (window.localStorage.length > 0) {
  arrayOfTasks = JSON.parse(window.localStorage.getItem("arrayOfTasks")); // هنا يتم فقط حفظ البيانات ضمن المتحول دون إظهارها
  getArrayOfTasksFromLocalStorageAndReturnItInDom(); // يمكنك استدعاء التابع الموجود لديك وسيقوم بإظهارها على الشاشة
} else {
  arrayOfTasks = [];
}

كما أنصحك بالابتعاد عن تسمية التوابع الطويلة "getArrayOfTasksFromLocalStorageAndReturnItInDom" التي قد تسبب لك أخطاء إملائية عند إعادة كتابة اسم التابع لاحقاً في أماكن مختلفة في الشيفرة البرمجية، ويمكنك مثلاً استبدال الاسم بـ: "getTasksArray" ووضع تعليق بجانب التابع يشرح عمله فذلك أفضل بكثير.

وبقية الخصائص أراها تعمل بشكل سليم كما أن تنسيق الصفحة لديك ممتاز ومتجاوب مع جميع الشاشات، تابع المشروع وحاول إضافة آلية الحذف والبحث عن عنوان مهمّة محددة.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 4 دقائق مضت قال Sam Ahw:

يمكنك ذكر الأجزاء التي تحدث فيها مشاكل مع كتابة رسائل الخطأ التي تواجهك وذلك سيساعدنا أكثر على الإجابة على سؤالك.

أرى من مشروعك أنك قمت بتطبيق بعض الآليات بشكل صحيح مثل استخدام local storage والتعامل مع المصفوفات.

من بعض الملاحظات التي وجدتها هي أنك قمت بتعريف متغيّر arrayOfTasks في بداية الشيفرة البرمجية باستخدام let، ومع ذلك تقوم بإعادة تعريفه من جديد ضمن التوابع، وهذا خطأ كون المتغيّر مسؤول عن التعامل مع البيانات في local storage:


let arrayOfTasks;


function getArrayOfTasksFromLocalStorageAndReturnItInDom() {

  let arrayOfTasks = JSON.parse(localStorage.getItem("arrayOfTasks"));

  arrayOfTasks.forEach((task) => {
    let div = document.createElement("div");
    div.className = "task";
    div.appendChild(document.createTextNode(task.title));
    tasksDiv.prepend(div);
  });
}

يمكنك استخدام var في بداية الملف والوصول إلى المتغيّر ضمن التوابع لاحقاً.

كما لاحظت أنه عند تحميل الصفحة لا يتم استعادة البيانات مع العلم أنها محفوظة ضمن local storage، لذلك يمكنك تغيير الكود الموجود هنا ليصبح كالتالي:


if (window.localStorage.length > 0) {
  arrayOfTasks = JSON.parse(window.localStorage.getItem("arrayOfTasks")); // هنا يتم فقط حفظ البيانات ضمن المتحول دون إظهارها
  getArrayOfTasksFromLocalStorageAndReturnItInDom(); // يمكنك استدعاء التابع الموجود لديك وسيقوم بإظهارها على الشاشة
} else {
  arrayOfTasks = [];
}

وبقية الخصائص أراها تعمل بشكل سليم، تابع المشروع وحاول إضافة آلية الحذف والبحث عن عنوان مهمّة محددة.

عندما اضغط علي زر الاضافه لا يحدث شيء

شي.png

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 8 دقائق مضت قال Mohamed Montaser3:

عندما اضغط علي زر الاضافه لا يحدث شيء

قم بتطبيق النصائح التي ذكرتها ولك، والأهم إزالة إعادة تعريف المتغيّر ضمن التوابع:

function getArrayOfTasksFromLocalStorageAndReturnItInDom() {

  let arrayOfTasks = JSON.parse(localStorage.getItem("arrayOfTasks")); //سبق وعرّفت هذا المتغيّر في أعلى الصفحة

  arrayOfTasks.forEach((task) => {
    let div = document.createElement("div");
    div.className = "task";
    div.appendChild(document.createTextNode(task.title));
    tasksDiv.prepend(div);
  });
}

وستحصل على النتيجة كما في الصورة المرفقة. أما بالنسبة بتابع إظهار المهمات، فيجب عليك أيضاً إضافة شرط معيّن كي لا يتم تكرار المهمات وإعادة الحلقة من جديد عند كل عملية إضافة.6288992262a2c_Screenshot2022-05-21103956.thumb.jpg.8c28a9ffed81bd94c216cae57288e400.jpg

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 2 دقائق مضت قال Sam Ahw:

قم بتطبيق النصائح التي ذكرتها ولك، والأهم إزالة إعادة تعريف المتغيّر ضمن التوابع:


function getArrayOfTasksFromLocalStorageAndReturnItInDom() {

  let arrayOfTasks = JSON.parse(localStorage.getItem("arrayOfTasks")); //سبق وعرّفت هذا المتغيّر في أعلى الصفحة

  arrayOfTasks.forEach((task) => {
    let div = document.createElement("div");
    div.className = "task";
    div.appendChild(document.createTextNode(task.title));
    tasksDiv.prepend(div);
  });
}

وستحصل على النتيجة كما في الصورة المرفقة. أما بالنسبة بتابع إظهار المهمات، فيجب عليك أيضاً إضافة شرط معيّن كي لا يتم تكرار المهمات وإعادة الحلقة من جديد عند كل عملية إضافة.6288992262a2c_Screenshot2022-05-21103956.thumb.jpg.8c28a9ffed81bd94c216cae57288e400.jpg

ما هو هذا الشرط وفي اي داله

بتاريخ 22 دقائق مضت قال Sam Ahw:

قم بتطبيق النصائح التي ذكرتها ولك، والأهم إزالة إعادة تعريف المتغيّر ضمن التوابع:


function getArrayOfTasksFromLocalStorageAndReturnItInDom() {

  let arrayOfTasks = JSON.parse(localStorage.getItem("arrayOfTasks")); //سبق وعرّفت هذا المتغيّر في أعلى الصفحة

  arrayOfTasks.forEach((task) => {
    let div = document.createElement("div");
    div.className = "task";
    div.appendChild(document.createTextNode(task.title));
    tasksDiv.prepend(div);
  });
}

وستحصل على النتيجة كما في الصورة المرفقة. أما بالنسبة بتابع إظهار المهمات، فيجب عليك أيضاً إضافة شرط معيّن كي لا يتم تكرار المهمات وإعادة الحلقة من جديد عند كل عملية إضافة.6288992262a2c_Screenshot2022-05-21103956.thumb.jpg.8c28a9ffed81bd94c216cae57288e400.jpg

.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

قم بتعديل الكود الموجود ضمن التابع "getArrayOfTasksFromLocalStorageAndReturnItInDom" ليتم المرور على المحتوى التصي الموجود في العناصر الأبناء والتأكد من عدم وجوده مسبقاً قبل إضافته، بذلك ستتجنب التكرار ويصبح الكود كالتالي:

function getArrayOfTasksFromLocalStorageAndReturnItInDom() {
  arrayOfTasks.forEach((task) => {
    if (
      (document.documentElement.textContent || document.documentElement.innerText).indexOf(task.title) == -1
    ) {
    let div = document.createElement("div");
    div.className = "task";
    div.appendChild(document.createTextNode(task.title));
    tasksDiv.prepend(div);
    }
    
  });
}

تأكد من أن تقوم بحذف محتوى local storage بعد إجراء التعديلات من نافذة المطور ضمن المتصفح.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 2 دقائق مضت قال Sam Ahw:

قم بتعديل الكود الموجود ضمن التابع "getArrayOfTasksFromLocalStorageAndReturnItInDom" ليتم المرور على المحتوى التصي الموجود في العناصر الأبناء والتأكد من عدم وجوده مسبقاً قبل إضافته، بذلك ستتجنب التكرار ويصبح الكود كالتالي:


function getArrayOfTasksFromLocalStorageAndReturnItInDom() {
  arrayOfTasks.forEach((task) => {
    if (
      (document.documentElement.textContent || document.documentElement.innerText).indexOf(task.title) == -1
    ) {
    let div = document.createElement("div");
    div.className = "task";
    div.appendChild(document.createTextNode(task.title));
    tasksDiv.prepend(div);
    }
    
  });
}

تأكد من أن تقوم بحذف محتوى local storage بعد إجراء التعديلات من نافذة المطور ضمن المتصفح.

لا يعمل

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 9 ساعات قال Sam Ahw:

لم تقم بتطبيق التعديلات إذاً. أرفق لك ملفات المشروع وصورة عن النتيجة

6288aa43b6f16_Screenshot2022-05-21115856.thumb.jpg.0b33e1dbeadb3238a757bcf83d3d4ef6.jpg

to-do-list.zip

لقد عملت ولاكن انا لا افهم الشرط

رابط هذا التعليق
شارك على الشبكات الإجتماعية

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...