아이콘 저장 및 로드

저장해야 하는 상태가 있는 아이콘도 있고 기존 상태를 기반으로 인스턴스화되는 아이콘도 있습니다. 예를 들어 댓글 아이콘은 텍스트를 저장해야 하지만 경고 아이콘은 블록이 연결되는 방식에 따라 인스턴스화되기 때문에 그렇지 않습니다.

아이콘이 상태를 저장해야 하는 경우 ISerializable 인터페이스를 구현하고 아이콘을 register해야 합니다.

아이콘에서 반환한 상태는 블록 상태의 icons 속성에 포함됩니다.

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

상태 저장

아이콘의 상태를 저장하려면 ISerializable 인터페이스의 saveState 메서드를 구현해야 합니다. 이 메서드는 loadState 메서드에 전달되는 임의의 json을 반환할 수 있습니다.

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

전체 직렬화 및 지원 데이터

saveState는 선택적 doFullSerialization 매개변수도 수신합니다. 이는 다른 직렬 변환기로 직렬화된 상태를 참조하는 아이콘에 의해 사용됩니다 (예: 지원 데이터 모델). 매개변수는 블록이 역직렬화될 때 참조된 상태를 사용할 수 없다는 신호를 보내므로 아이콘은 모든 지원 상태 자체를 직렬화해야 합니다. 예를 들어 개별 블록이 직렬화되거나 블록을 복사하여 붙여넣기할 때 마찬가지입니다.

이러한 연결의 일반적인 두 가지 사용 사례는 다음과 같습니다.

  • 개별 블록이 지원 데이터 모델이 없는 작업공간에 로드되면 아이콘에는 새 데이터 모델을 만들기에 충분한 자체 상태의 정보가 있습니다.
  • 블록을 복사하여 붙여넣으면 아이콘은 항상 기존 지원 데이터 모델을 참조하는 대신 새 지원 데이터 모델을 만듭니다.

로드 상태

아이콘의 상태를 저장하려면 ISerializable 인터페이스의 loadState 메서드를 구현해야 합니다. 이 메서드는 saveState 메서드에서 반환된 JSON을 가져옵니다.

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

아이콘 클래스 등록

마지막으로, 직렬화 시스템에서 아이콘을 인스턴스화할 수 있도록 아이콘을 등록해야 합니다. 아이콘을 등록하는 데 사용되는 IconTypegetType 메서드에서 반환된 것과 동일한 문자열이어야 합니다.

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);