ワークスペースの変更はすべてイベントをトリガーします。これらのイベントは、各変更の前後の状態を完全に記述します。
ワークスペースからのイベントをリッスンする
ワークスペースには、イベント ストリームをリッスンするために使用できる 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_statements、logic_compare、procedures_ifreturn の各ブロックをご覧ください。
編集可能なフィールドには、入力の検証と副作用の発生のための独自のイベント リスナーがあります。
イベントタイプ
個々のイベントについては、リファレンス ドキュメントをご覧ください。
デモ
イベントでできることの例については、ミラー デモをご覧ください。このデモには、イベントを使用して同期される 2 つの Blockly ワークスペースがあります。