שמירה וטעינה של סמלים

לסמלים מסוימים יש מצב שצריך לשמור, ואילו אחרים נוצרים על סמך המצב הקיים. לדוגמה, סמלי של תגובות צריכים לשמור את הטקסט שלהם, ואילו סמלי האזהרה לא נוצרים כי הם נוצרים על סמך האופן שבו הבלוקים מחוברים.

אם הסמל צריך לשמור את המצב שלו, עליכם להטמיע את ממשק 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 אופציונלי. הסמל הזה משמש סמלים שמפנים למצבים שלהם, בחלוקה לסריאליזר אחר (כמו מודלים של נתוני גיבוי). הפרמטר מסמן שהמצב שהוזכר לא יהיה זמין כשהבלוק עובר לרכיב deserialize, ולכן הסמל צריך ליצור סדרה של כל מצב הגיבוי עצמו. לדוגמה, זה נכון כשבלוק מסוים נמצא בסדרה או כשמתבצעת הדבקה של בלוק מסוים.

שני תרחישים נפוצים לדוגמה:

  • כשבלוק בודד נטען לסביבת עבודה שבה לא קיים מודל נתונים לגיבוי, בסמל יש מספיק מידע במצב שלו כדי ליצור מודל נתונים חדש.
  • כשמעתיקים ומדביקים בלוק, הסמל תמיד יוצר מודל חדש של נתוני גיבוי במקום להפנות למודל קיים.

מצב טעינה

כדי לשמור את מצב הסמל, צריך להטמיע את השיטה 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);