บันทึกและโหลดไอคอน

ไอคอนบางรายการมีสถานะที่ต้องบันทึก ขณะที่ไอคอนอื่นๆ จะมีการสร้างอินสแตนซ์โดยอิงตามสถานะที่มีอยู่ ตัวอย่างเช่น ไอคอนความคิดเห็นจะต้องบันทึกข้อความไว้ ขณะที่ไอคอนคำเตือนไม่ใช่เพราะระบบสร้างขึ้นตามการเชื่อมต่อบล็อก

หากไอคอนต้องบันทึกสถานะ คุณต้องใช้อินเทอร์เฟซ 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 ที่ไม่บังคับด้วย ซึ่งใช้โดยไอคอนที่อ้างอิงสถานะที่ทำให้เป็นอนุกรมโดยซีเรียลไลเซอร์อื่น (เช่น การสำรองข้อมูลโมเดลข้อมูล) สัญญาณพารามิเตอร์ที่สถานะอ้างอิงจะใช้งานไม่ได้เมื่อบล็อกได้รับการดีซีเรียลไลซ์ ดังนั้นไอคอนควรจะทำให้สถานะการสนับสนุนทั้งหมดเป็นอนุกรม ตัวอย่างเช่น กรณีนี้เกิดขึ้นจริงเมื่อมีการทำให้บล็อกหนึ่งๆ เป็นอนุกรม หรือเมื่อมีการคัดลอกและวางบล็อก

กรณีการใช้งานทั่วไปสำหรับกรณีนี้มี 2 กรณีดังนี้

  • เมื่อมีการโหลดบล็อกแต่ละรายการลงในพื้นที่ทำงานที่ไม่มีโมเดลข้อมูลสนับสนุนอยู่ ไอคอนจะมีข้อมูลในสถานะของตัวเองเพียงพอที่จะสร้างโมเดลข้อมูลใหม่
  • เมื่อมีการคัดลอกและวางบล็อก ไอคอนจะสร้างโมเดลข้อมูลสนับสนุนใหม่เสมอแทนที่จะอ้างอิงโมเดลที่มีอยู่

สถานะการโหลด

หากต้องการบันทึกสถานะของไอคอน คุณต้องใช้เมธอด 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);