الأحداث

يؤدي كل تغيير في مساحة العمل إلى تشغيل حدث. تصف هذه الأحداث بشكل كامل حالة كل تغيير قبل حدوثه وبعده.

الاستماع إلى الأحداث من مساحة العمل

تتضمّن مساحات العمل الطريقتَين addChangeListener وremoveChangeListener اللتَين يمكن استخدامهما للاستماع إلى سلسلة الأحداث. من الأمثلة على ذلك الـ إنشاء الرموز في الوقت الفعلي. وهناك مثال آخر وهو الـ عرض التوضيحي للحد الأقصى لعدد الوحدات. وكما هو الحال غالبًا، لا يهتم أي من هذين المثالَين بالحدث الذي أدّى إلى تشغيلهما. بل ينظران ببساطة إلى الحالة الحالية لمساحة العمل.

ستنظر أداة الاستماع إلى الأحداث الأكثر تطورًا إلى الحدث الذي أدّى إلى تشغيلها. يرصد المثال التالي متى ينشئ المستخدم أول تعليق له، ويصدر تنبيهًا، ثم يتوقف عن الاستماع حتى لا يتم تشغيل أي تنبيهات أخرى.

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 للاطّلاع على أمثلة.

يُرجى العِلم أنّ الحقول القابلة للتعديل تتضمّن أدوات استماع إلى الأحداث الخاصة بها للتحقّق من صحة الإدخال والتسبب في آثار جانبية.

أنواع الأحداث

يُرجى الرجوع إلى المستندات المرجعية للحصول على معلومات حول الأحداث الفردية.

عرض توضيحي

للاطّلاع على مثال على الأشياء الرائعة التي يمكنك إجراؤها باستخدام الأحداث، يمكنك الاطّلاع على العرض التوضيحي لـ mirror. يتضمّن هذا العرض التوضيحي مساحتَي عمل في Blockly يتم الحفاظ على مزامنتهما باستخدام الأحداث.