事件

工作區的每次變更都會觸發事件。這些事件會完整說明每次變更前後的狀態。

監聽工作區的事件

工作區有 addChangeListenerremoveChangeListener 方法,可用於監聽事件串流。例如即時生成程式碼。另一個例子是最大區塊限制示範。如同一般情況,這兩個範例都不會在意觸發事件為何。他們只會查看工作區的目前狀態。

更精密的事件監聽器會查看觸發事件。以下範例會偵測使用者何時建立第一則留言、發出快訊,然後停止監聽,以免觸發其他快訊。

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 區塊。

請注意,可編輯的欄位有自己的事件監聽器,用於輸入驗證和造成副作用。

事件類型

如要瞭解個別事件的相關資訊,請參閱參考文件

示範

如要瞭解事件的用途,請參閱鏡像示範。這個示範有兩個 Blockly 工作區,會使用事件保持同步。