حفظ الرموز وتحميلها

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

إذا كان رمزك بحاجة إلى حفظ حالته، يجب تنفيذ واجهة ISerializable وregister الرمز.

يتم تضمين الحالة التي يعرضها الرمز في السمة icons الخاصة بحالة الحظر:

{
  'blocks': {
    'languageVersion': 0,
    'blocks': [
      {
        'type': 'my_block',
        'icons': {
          // Your state goes here!
          'my_icon': 'some state',
        }
      }
    ]
  }
}

حفظ الحالة

لحفظ حالة الرمز، يجب تنفيذ طريقة saveState لواجهة ISerializable. يمكن أن تعرض هذه الطريقة تنسيق json عشوائيًا يتم تمريره إلى طريقة loadState.

saveState() {
  return this.state;  // Some arbirtary JSON-compatible data.
}

التسلسل الكامل والبيانات الاحتياطية

تتلقّى saveState أيضًا معلَمة doFullSerialization اختيارية. يُستخدم هذا من خلال الرموز التي تشير إلى الحالة المتسلسلة بواسطة serializer مختلف (مثل نماذج البيانات الاحتياطية). تشير المَعلمة إلى أنّ الحالة المُشار إليها لن تكون متاحة عند إلغاء تسلسل الكتلة، لذا يجب أن يتسلسل الرمز جميع حالة الدعم نفسها. على سبيل المثال، يكون هذا صحيحًا عندما تكون كتلة فردية متسلسلة، أو عند نسخ كتلة.

هناك حالتا استخدام شائعتان لذلك هما:

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

حالة الحمولة

لحفظ حالة الرمز، يجب تنفيذ طريقة loadState لواجهة ISerializable. تستخدم هذه الطريقة ملف JSON الذي تعرضه طريقة saveState.

loadState(state) {
  this.state = state;
}

تسجيل فئات الرموز

أخيرًا، تحتاج إلى تسجيل الأيقونة حتى يتمكن نظام التسلسل من إثباتها. تذكَّر أنّ IconType المستخدَم لتسجيل الرمز يجب أن يكون له السلسلة نفسها التي تعرضها طريقة getType.

class myIcon extends Blockly.icons.Icon {
  getType() {
    return new Blockly.icons.IconType('my_icon');
  }
}

Blockly.icons.registry.register(
    new Blockly.icons.IconType('my_icon'), myIcon);