イベント

ワークスペースの変更ごとにイベントがトリガーされます。これらのイベントは、各変更の前後の状態を完全に記述します。

ワークスペースのイベントをリッスンする

ワークスペースには、イベント ストリームのリッスンに使用できる addChangeListener メソッドと removeChangeListener メソッドがあります。たとえば、コードのリアルタイム生成などです。別の例として、最大ブロック数の制限のデモがあります。多くの場合、これらの 2 つの例のどちらも、トリガー イベントが何であるかは気にしません。ワークスペースの現在の状態を確認するだけです。

より高度なイベント リスナーは、トリガーとなるイベントを確認します。次の例では、ユーザーが最初のコメントを作成したときに検出してアラートを発行し、その後はリッスンを停止して、アラートがトリガーされないようにします。

function onFirstComment(event) {
  if (event.type == Blockly.Events.BLOCK_CHANGE &&
      event.element == 'comment' &&
      !event.oldValue && event.newValue) {
    alert('Congratulations on creating your first comment!')
    workspace.removeChangeListener(onFirstComment);
  }
}
workspace.addChangeListener(onFirstComment);

フライアウト内で発生するイベントをリッスンするには、フライアウトのワークスペースにリスナーを追加します。

var flyoutWorkspace = yourWorkspace.getFlyout().getWorkspace();
flyoutWorkspace.addChangeListener(onFirstComment);

ブロックのイベントをリッスンする

ブロックには、ワークスペースの変更(ブロックに関係のない変更を含む)時に呼び出される変更リスナー関数を設定できます。これらは、ブロックの警告テキストや、ワークスペース外の同様のユーザー通知を設定するためによく使用されます。

この関数は、関数で Block.setOnChange を呼び出すことで追加されます。初期化時に追加することも、すべてのプラットフォームで使用する場合は JSON 拡張機能を使用して追加することもできます。

JSON

{
  // ...,
  "extensions":["warning_on_change"],
}

Blockly.Extensions.register('warning_on_change', function() {
  // Example validation upon block change:
  this.setOnChange(function(changeEvent) {
    if (this.getInput('NUM').connection.targetBlock()) {
      this.setWarningText(null);
    } else {
      this.setWarningText('Must have an input block.');
    }
  });
});

JavaScript

Blockly.Blocks['block_type'] = {
  init: function() {
    // Example validation upon block change:
    this.setOnChange(function(changeEvent) {
      if (this.getInput('NUM').connection.targetBlock()) {
        this.setWarningText(null);
      } else {
        this.setWarningText('Must have an input block.');
      }
    });
  }
}

ブロックに onchange プロパティを直接設定することもできます。

JavaScript

Blockly.Blocks['block_type'] = {
  init: function() {
    // Example validation upon block change:
    this.onchange = function(changeEvent) {
      if (this.getInput('NUM').connection.targetBlock()) {
        this.setWarningText(null);
      } else {
        this.setWarningText('Must have an input block.');
      }
    };
  }
}

システムは、変更イベントを渡して関数を呼び出します。関数内で、this はブロック インスタンスを参照します。

この関数は変更時に呼び出されるため、使用する場合は、リスナーが迅速に実行されるようにする必要があります。また、ワークスペースの変更がリスナーにカスケードまたはループバックする可能性があることにも注意する必要があります。

例については、controls_flow_statementslogic_compareprocedures_ifreturn のブロックをご覧ください。

編集可能なフィールドには、入力検証と副作用の発生のための独自のイベント リスナーがあります。

イベントタイプ

個々のイベントについては、リファレンス ドキュメントをご覧ください。

デモ

イベントでできることの例については、ミラーのデモをご覧ください。このデモには 2 つの Blockly ワークスペースがあり、イベントを使用して同期されています。