ইভেন্ট

ওয়ার্কস্পেসের প্রতিটি পরিবর্তন একটি ইভেন্ট ট্রিগার করে। এই ইভেন্টগুলো প্রতিটি পরিবর্তনের আগের ও পরের অবস্থা সম্পূর্ণরূপে বর্ণনা করে।

কর্মক্ষেত্রের ঘটনাবলী শুনুন

ওয়ার্কস্পেসগুলিতে 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.');
    }
  });
});

জাভাস্ক্রিপ্ট

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 প্রপার্টিটি সেট করতে পারেন:

জাভাস্ক্রিপ্ট

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.');
      }
    };
  }
}

সিস্টেমটি change ইভেন্টটি পাস করে ফাংশনটিকে কল করে। ফাংশনের ভিতরে, this ব্লক ইনস্ট্যান্সটিকে নির্দেশ করে।

যেহেতু যেকোনো পরিবর্তনেই ফাংশনটি কল করা হয়, তাই এটি ব্যবহার করা হলে ডেভেলপারদের নিশ্চিত করা উচিত যেন লিসেনারটি দ্রুত চলে। এছাড়াও, ওয়ার্কস্পেসের এমন কোনো পরিবর্তন সম্পর্কে সতর্ক থাকা উচিত যা ক্যাসকেড করতে পারে বা লিসেনারে লুপ ব্যাক করতে পারে।

উদাহরণের জন্য controls_flow_statements , logic_compare এবং procedures_ifreturn ব্লকগুলো দেখুন।

উল্লেখ্য যে, সম্পাদনাযোগ্য ফিল্ডগুলির ইনপুট যাচাইকরণ এবং সাইড এফেক্ট ঘটানোর জন্য নিজস্ব ইভেন্ট লিসেনার থাকে।

ইভেন্টের প্রকারভেদ

স্বতন্ত্র ইভেন্টগুলো সম্পর্কে তথ্যের জন্য রেফারেন্স ডকুমেন্টেশন দেখুন।

ডেমো

ইভেন্ট ব্যবহার করে কী কী চমৎকার কাজ করা যায় তার একটি উদাহরণ দেখতে চাইলে, আপনি মিরর ডেমোটি দেখতে পারেন। এই ডেমোটিতে দুটি ব্লক্লি ওয়ার্কস্পেস রয়েছে, যেগুলোকে ইভেন্ট ব্যবহার করে সিঙ্ক করে রাখা হয়।