একটি কাস্টম ক্ষেত্র আপগ্রেড করা হচ্ছে

জুলাই 2019-এ ( রিলিজ 2.20190722 ) আরও কোডিফাইড ফিল্ড API যোগ করা হয়েছিল। এটি যতটা সম্ভব পিছনের দিকে সামঞ্জস্যপূর্ণ হওয়ার উদ্দেশ্যে করা হয়েছে৷ এর মানে হল যে আপনি যদি জুলাই 2019 এর আগে একটি কাস্টম ক্ষেত্র তৈরি করে থাকেন তবে এটি সম্ভবত কাজ চালিয়ে যাবে। আপনার কাস্টম ক্ষেত্রটি আপগ্রেড করা দরকার কিনা তা সিদ্ধান্ত নেওয়ার আগে আপনাকে বিপদের অঞ্চল বিভাগটি পড়তে হবে এবং আপনার ক্ষেত্রটিকে একটি পুঙ্খানুপুঙ্খ পরীক্ষা দিতে হবে।

যেহেতু জুলাই 2019 এর আগে ক্ষেত্রগুলির মধ্যে মানককরণের অভাব ছিল, একজন বিকাশকারীকে করতে হবে এমন সমস্ত পরিবর্তনগুলি কভার করা কঠিন। এই দস্তাবেজটি সম্ভাব্য সমস্ত পরিবর্তনগুলি কভার করার চেষ্টা করে, কিন্তু যদি এই নথিতে আপনি আগ্রহী এমন কিছু কভার না করে, অনুগ্রহ করে আপগ্রেড সহায়তা পাওয়ার বিভাগটি পড়ুন৷

বিপজ্জনক এলাকা

বিপজ্জনক এলাকাগুলি পরিচিত জায়গা যেখানে API পরিবর্তিত হয়েছে এবং আপনার ক্ষেত্রটি ভেঙে যেতে পারে৷

Blockly.Field.register

Blockly.Field.register(); . এখন একটি ফিল্ডরেজিস্ট্রি নামস্থান রয়েছে যা নিবন্ধন পরিচালনা করে।

Blockly.Field.register('my_field_name', myFieldClass);

হয়ে ওঠে:

Blockly.fieldRegistry.register('my_field_name', myFieldClass);

সেটটেক্সট

setText ফাংশনটি আর ব্লকলি কোর দ্বারা ডাকা হয় না, তাই যদি আপনার setText ফাংশনে লজিক থাকে তবে এটিকে ফাংশনের মান হ্যান্ডলিং স্যুটে, গেটটেক্সট ফাংশন এবং রেন্ডারিং ফাংশনে স্থানান্তরিত করতে হবে (আপনার setText ফাংশন ঠিক কী তার উপর নির্ভর করে করছেন)।

CustomFields.UpgradeField.prototype.setText = function(newText) {
  // Do validation.
  if (typeof newText != 'string' || newText === this.text_) {
    return;
  }

  // Fire event.
  if (this.sourceBlock_ && Blockly.Events.isEnabled()) {
    Blockly.events.fire(new Blockly.Events.BlockChange(
        this.sourceBlock_, 'field', this.name, this.text_, newText
    ));
  }

  // Update text value.
  this.text_ = 'prefix' + newText;

  // Rerender.
  this.size_.width = 0;
};

হয়ে ওঠে:

CustomFields.UpgradeField.prototype.doClassValidation_ = function(newValue) {
  if (typeof newValue != 'string') {
    return null;
  }
  return newValue;
};

CustomFields.UpgradeField.prototype.getText = function() {
  return  'prefix' + this.value_;
}

ব্লকলি স্বয়ংক্রিয়ভাবে পরিচালনা করে:

  • নতুন মান পুরানো মানের থেকে আলাদা কিনা তা পরীক্ষা করা হচ্ছে।
  • মান আপডেট করা হচ্ছে।
  • ফায়ারিং পরিবর্তন ঘটনা.
  • ক্ষেত্র পুনরায় রেন্ডারিং.

আপনাকে পরিচালনা করতে হবে:

প্রস্তাবিত আপগ্রেডগুলি হল সেই জায়গা যেখানে ক্ষেত্র API পরিবর্তন করা হয়েছে, কিন্তু আপনি যদি পরিবর্তন না করা বেছে নেন তবে আপনার ক্ষেত্রটি সম্ভবত এখনও কাজ করবে৷

সিরিয়ালাইজেবল

EDITABLE এবং SERIALIZABLE বৈশিষ্ট্যগুলি সম্পর্কে আরও তথ্যের জন্য সম্পাদনাযোগ্য এবং ক্রমিক বৈশিষ্ট্যগুলি দেখুন৷

CustomFields.UpgradeField.prototype.SERIALIZABLE = true;

নীচের সতর্কতা উপেক্ষাযোগ্য, কিন্তু আপনি SERIALIZABLE সম্পত্তি সংজ্ঞায়িত করে এটি সমাধান করতে পারেন:

Detected an editable field that was not serializable. Please define
SERIALIZABLE property as true on all editable custom fields. Proceeding
with serialization.

উপরের সতর্কতাটির অর্থ হল ব্লকলি বিশ্বাস করে যে আপনি ক্ষেত্রটিকে সিরিয়ালাইজ করতে চান (কারণ EDITABLE সম্পত্তিটি সত্য), তবে আপনি যতক্ষণ না SERIALIZABLE বৈশিষ্ট্যটি সংজ্ঞায়িত করছেন ততক্ষণ পর্যন্ত নিশ্চিত হতে পারবেন না। আপনি যদি এটিকে একা ছেড়ে দিতে চান তবে সবকিছু সঠিকভাবে কাজ করবে এবং আপনার ক্ষেত্রটি সিরিয়াল করা হবে, তবে আপনি কনসোল সতর্কতা পাবেন।

আকার_.প্রস্থ

this.size_.width = 0;

হয়ে ওঠে:

this.isDirty_ = true;

নীচের সতর্কতা উপেক্ষাযোগ্য, কিন্তু আপনি size_.width বৈশিষ্ট্যের পরিবর্তে isDirty_ বৈশিষ্ট্য সেট করে এটি সমাধান করতে পারেন:

Deprecated use of setting size_.width to 0 to rerender a field. Set
field.isDirty_ to true instead.

উপরের সতর্কতার অর্থ হল ব্লকলি সনাক্ত করেছে যে আপনি একটি ক্ষেত্র পুনরায় রেন্ডার করার জন্য একটি পুরানো পদ্ধতি ব্যবহার করছেন এবং আপনি নতুন পদ্ধতি ব্যবহার করতে চান।

isDirty_ সম্পত্তি সম্পর্কে আরও তথ্যের জন্য isDirty_ দেখুন।

এটা

সাবক্লাসে ডুপ্লিকেট কোড কমাতে init ফাংশনটিকে একটি টেমপ্লেট ফাংশনে তৈরি করা হয়েছে।

CustomFields.UpgradeField.prototype.init = function() {
  if (this.fieldGroup_) {
    // Already initialized once.
    return;
  }

  // Call superclass.
  CustomFields.UpgradeField.superClass_.init.call(this);

  // Create DOM elements.
  this.extraDom_ = Blockly.utils.dom.createSvgElement('image',
      {
        'height': '10px',
        'width': '10px'
      });
  this.extraDom_.setAttributeNS('http://www.w3.org/1999/xlink',
      'xlink:href', 'image.svg');
  this.extraDom_.style.cursor = 'pointer';
  this.fieldGroup_.appendChild(this.extraDom_);

  // Bind events.
  this.mouseOverWrapper_ =
    Blockly.browserEvents.bind(
        this.getClickTarget_(), 'mouseover', this, this.onMouseOver_);
  this.mouseOutWrapper_ =
    Blockly.browserEvents.bind(
        this.getClickTarget_(), 'mouseout', this, this.onMouseOut_);

  // Render.
  this.setValue(this.getValue());
};

হয়ে ওঠে:

CustomFields.UpgradeField.prototype.initView = function() {
  CustomFields.UpgradeField.superClass_.initView.call(this);

  this.extraDom_ = Blockly.utils.dom.createSvgElement('image',
      {
        'height': '10px',
        'width': '10px'
      });
  this.extraDom_.setAttributeNS('http://www.w3.org/1999/xlink',
      'xlink:href', 'image.svg');
  this.extraDom_.style.cursor = 'pointer';
  this.fieldGroup_.appendChild(this.extraDom_);
};

CustomFields.UpgradeField.prototype.bindEvents_ = function() {
  CustomFields.UpgradeField.superClass_.bindEvents_.call(this);

  this.mouseOverWrapper_ =
    Blockly.bindEvent_(
        this.getClickTarget_(), 'mouseover', this, this.onMouseOver_);
  this.mouseOutWrapper_ =
    Blockly.bindEvent_(
        this.getClickTarget_(), 'mouseout', this, this.onMouseOut_);
};

এর মানে হল যে ব্লকলি এখন স্বয়ংক্রিয়ভাবে পরিচালনা করে:

  • ক্ষেত্রটি ইতিমধ্যেই আরম্ভ করা হয়েছে কিনা তা পরীক্ষা করা হচ্ছে।
  • fieldGroup_ তৈরি করা হচ্ছে_।
  • ক্ষেত্র রেন্ডারিং.
  • বাইন্ডিং টুলটিপ এবং এডিটর ইভেন্ট দেখান।

আপনাকে পরিচালনা করতে হবে:

onMouseDown_

CustomFields.UpgradeField.prototype.onMouseDown_ = function(e) {
  // ...
};

হয়ে ওঠে:

CustomFields.UpgradeField.prototype.showEditor_ = function() {
  // ...
}

আমরা সুপারিশ করি যে আপনি onMouseDown_ ফাংশনের পরিবর্তে মাউস ক্লিকগুলি পরিচালনা করতে showEditor_ ফাংশনটিকে ওভাররাইড করুন কারণ এটি অঙ্গভঙ্গি সিস্টেমের মধ্য দিয়ে ইনপুট যাওয়ার অনুমতি দেয়৷

সম্পাদকদের সম্পর্কে আরও তথ্যের জন্য সম্পাদক দেখুন।

সেট ভ্যালু

setValue ফাংশন এখন সাবক্লাসে ডুপ্লিকেট কোড কমাতে একটি টেমপ্লেট ফাংশন । যদি আপনার setValue ফাংশনে যুক্তি থাকে, তাহলে মান হ্যান্ডলিং- এ বর্ণিত মান হ্যান্ডলিং পাথগুলির সাথে মানানসই করার জন্য এটিকে রিফ্যাক্টর করার কথা বিবেচনা করুন।

পাঠ্য_

আমরা সুপারিশ করি যে আপনি কখনই সরাসরি আপনার ক্ষেত্রের text_ প্রপার্টি অ্যাক্সেস বা আপডেট করবেন না। পরিবর্তে, আপনার ক্ষেত্রের ব্যবহারকারী পাঠযোগ্য পাঠ্য অ্যাক্সেস করতে getText ফাংশন এবং আপনার ক্ষেত্রের সঞ্চিত মান আপডেট করতে setValue ফাংশন ব্যবহার করুন।

একটি ক্ষেত্রের মান বনাম এর পাঠ্য সম্পর্কে আরও তথ্যের জন্য একটি ক্ষেত্রের অ্যানাটমি দেখুন।

আপগ্রেড সহায়তা পাচ্ছেন

কি প্রদান করতে হবে

সাহায্যের জন্য জিজ্ঞাসা করার সময় নির্দিষ্ট প্রশ্ন জিজ্ঞাসা করা ভাল:

প্রস্তাবিত নয়: "এই ক্ষেত্রের সাথে কি ভুল?"

এছাড়াও সুপারিশ করা হয় না: "আমাকে এই ক্ষেত্রটি আপগ্রেড করতে সাহায্য করুন।"

প্রস্তাবিত: "ক্ষেত্রের পাঠ্য সঠিকভাবে আপডেট হচ্ছে না।"

আপনাকে সাহায্যকারী লোকেদের সংস্থান সরবরাহ করাও প্রয়োজনীয়। এই ফাইলগুলি অন্যদের ব্যবহার করা সহজ হওয়া উচিত।

প্রস্তাবিত নয়:

  • কোডের ছবি।
  • অসম্পূর্ণ কোড।

প্রস্তাবিত:

  • একটি পাঠ্য বিন্যাসে সম্পূর্ণ ফিল্ড কোড.
  • খারাপ ক্ষেত্রের আচরণের জিআইএফ-এর ছবি।
  • খারাপ ক্ষেত্রের আচরণ পুনরুত্পাদন পদক্ষেপ.
  • ব্লকলি যে সংস্করণ থেকে আপনি আপগ্রেড করছেন।

কোথায় পোস্ট করবেন

ব্লকলি ডেভেলপার ফোরামে আপগ্রেড প্রশ্ন পোস্ট করুন।

আপনি যদি নিশ্চিত হন যে সমস্যাটি ব্লকলি কোরের সাথে একটি সমস্যা আপনি ব্লকলি গিটহাবে একটি সমস্যা পোস্ট করতে পারেন। আপনি একটি সমস্যা পোস্ট করার সিদ্ধান্ত নিলে, অনুরোধ করা সমস্ত তথ্য পূরণ করুন।