জুলাই ২০১৯ ( রিলিজ ২.২০১৯০৭২২ ) তে আরও কোডেড ফিল্ডস এপিআই যুক্ত করা হয়েছিল। এটি যতটা সম্ভব পিছনের দিকে সামঞ্জস্যপূর্ণ করার উদ্দেশ্যে তৈরি করা হয়েছে। এর অর্থ হল যদি আপনি জুলাই ২০১৯ এর আগে একটি কাস্টম ফিল্ড তৈরি করে থাকেন তবে এটি সম্ভবত কাজ চালিয়ে যাবে। আপনার কাস্টম ফিল্ড আপগ্রেড করা প্রয়োজন কিনা তা সিদ্ধান্ত নেওয়ার আগে আপনার বিপদ অঞ্চল বিভাগটি পড়া উচিত এবং আপনার ফিল্ডটি পুঙ্খানুপুঙ্খভাবে পরীক্ষা করা উচিত।
জুলাই ২০১৯ এর আগে বিভিন্ন ক্ষেত্রে মানসম্মতকরণের অভাব থাকায়, একজন ডেভেলপারের প্রয়োজনীয় সকল পরিবর্তন কভার করা কঠিন। এই ডকুমেন্টে সম্ভাব্য সকল পরিবর্তন কভার করার চেষ্টা করা হয়েছে, কিন্তু যদি এই ডকুমেন্টে আপনার আগ্রহের কিছু না থাকে, তাহলে অনুগ্রহ করে আপগ্রেড সহায়তা পাওয়া সম্পর্কে বিভাগটি পড়ুন।
বিপজ্জনক এলাকা
বিপদজনক এলাকা হলো সেইসব পরিচিত স্থান যেখানে API পরিবর্তিত হয়েছে, এবং আপনার ক্ষেত্রটি নষ্ট হয়ে যেতে পারে।
ব্লকলি.ফিল্ড.রেজিস্টার
ক্ষেত্রগুলি আর Blockly.Field.register(); এর মাধ্যমে নিবন্ধিত হয় না। এখন একটি fieldRegistry নেমস্পেস রয়েছে যা নিবন্ধন পরিচালনা করে।
Blockly.Field.register('my_field_name', myFieldClass);
হয়ে যায়:
Blockly.fieldRegistry.register('my_field_name', myFieldClass);
সেটটেক্সট
ব্লকলি কোর দ্বারা setText ফাংশনটি আর কল করা হয় না, তাই যদি আপনার setText ফাংশনে লজিক থাকে তবে এটিকে ফাংশনের মান হ্যান্ডলিং স্যুট, getText ফাংশন এবং রেন্ডারিং ফাংশনগুলিতে স্থানান্তর করতে হবে (আপনার 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_;
}
ব্লকলি স্বয়ংক্রিয়ভাবে পরিচালনা করে:
- নতুন মানটি পুরাতন মানের চেয়ে আলাদা কিনা তা পরীক্ষা করা হচ্ছে।
- মান আপডেট করা হচ্ছে।
- গুলি চালানোর ঘটনা পরিবর্তন।
- ক্ষেত্রটি পুনর্নির্মাণ করা হচ্ছে।
আপনাকে পরিচালনা করতে হবে:
- মান যাচাইকরণ (
doClassValidation_)। - ফিল্ড টেক্সট (
getText)। - ফিল্ড UI
প্রস্তাবিত আপগ্রেড
প্রস্তাবিত আপগ্রেডগুলি হল সেই জায়গা যেখানে ফিল্ড 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 সম্পর্কে
সাবক্লাসে ডুপ্লিকেট কোড কমাতে 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_);
};
এর মানে হল যে blockly এখন স্বয়ংক্রিয়ভাবে পরিচালনা করে:
- ক্ষেত্রটি ইতিমধ্যেই শুরু হয়েছে কিনা তা পরীক্ষা করা হচ্ছে।
-
fieldGroup_তৈরি করা হচ্ছে। - ক্ষেত্রটি রেন্ডার করা হচ্ছে।
- টুলটিপ এবং শো এডিটর ইভেন্টগুলিকে বাইন্ডিং করা।
আপনাকে পরিচালনা করতে হবে:
- অতিরিক্ত DOM উপাদান যোগ করা হচ্ছে (
initView)। - অতিরিক্ত ইভেন্ট বাইন্ডিং যোগ করা হচ্ছে (
bindEvents_)। - ইভেন্ট বাইন্ডিং নিষ্পত্তি (
dispose)।
অনমাউসডাউন_
CustomFields.UpgradeField.prototype.onMouseDown_ = function(e) {
// ...
};
হয়ে যায়:
CustomFields.UpgradeField.prototype.showEditor_ = function() {
// ...
}
আমরা সুপারিশ করছি যে আপনি onMouseDown_ ফাংশনের পরিবর্তে showEditor_ ফাংশনটি ওভাররাইড করে মাউস ক্লিক পরিচালনা করুন কারণ এটি ইনপুটকে জেসচার সিস্টেমের মধ্য দিয়ে যেতে দেয়।
সম্পাদকদের সম্পর্কে আরও তথ্যের জন্য সম্পাদক দেখুন।
সেটভ্যালু
setValue ফাংশনটি এখন সাবক্লাসে ডুপ্লিকেট কোড কমানোর জন্য একটি টেমপ্লেট ফাংশন । যদি আপনার setValue ফাংশনে লজিক থাকে, তাহলে Value handling এ বর্ণিত মান হ্যান্ডলিং পাথের সাথে মানানসই করে এটিকে রিফ্যাক্টর করার কথা বিবেচনা করুন।
টেক্সট_
আমরা সুপারিশ করছি যে আপনি কখনই আপনার ক্ষেত্রের text_ বৈশিষ্ট্য সরাসরি অ্যাক্সেস বা আপডেট করবেন না। পরিবর্তে, আপনার ক্ষেত্রের ব্যবহারকারীর পাঠযোগ্য পাঠ্য অ্যাক্সেস করতে getText ফাংশন এবং আপনার ক্ষেত্রের সঞ্চিত মান আপডেট করতে setValue ফাংশন ব্যবহার করুন।
একটি ক্ষেত্রের মান বনাম এর পাঠ্য সম্পর্কে আরও তথ্যের জন্য একটি ক্ষেত্রের অ্যানাটমি দেখুন।
আপগ্রেড সহায়তা পাওয়া
কী প্রদান করবেন
সাহায্য চাওয়ার সময় নির্দিষ্ট প্রশ্ন জিজ্ঞাসা করা ভালো:
সুপারিশ করা হয় না: "এই ক্ষেত্রের সমস্যা কী?"
"এই ক্ষেত্রটি আপগ্রেড করতে আমাকে সাহায্য করুন" - এটিও সুপারিশ করা হয় না।
প্রস্তাবিত: "ক্ষেত্রের পাঠ্য সঠিকভাবে আপডেট হচ্ছে না।"
আপনাকে সহায়তাকারী ব্যক্তিদের জন্য সম্পদ সরবরাহ করাও প্রয়োজনীয়। এই ফাইলগুলি অন্যদের জন্য ব্যবহার করা সহজ হওয়া উচিত।
সুপারিশ করা হয় না:
- কোডের ছবি।
- অসম্পূর্ণ কোড।
প্রস্তাবিত:
- টেক্সট ফর্ম্যাটে ফিল্ড কোড সম্পূর্ণ করুন।
- খারাপ ফিল্ড আচরণের জিআইএফের ছবি।
- খারাপ ক্ষেত্রের আচরণ পুনরুৎপাদনের পদক্ষেপ।
- ব্লকলির যে ভার্সন থেকে আপনি আপগ্রেড করছেন।
কোথায় পোস্ট করবেন
ব্লকলি ডেভেলপার ফোরামে আপগ্রেড প্রশ্ন পোস্ট করুন।
যদি আপনি নিশ্চিত হন যে সমস্যাটি ব্লকলি কোরের সমস্যা, তাহলে আপনি ব্লকলি গিটহাবে একটি সমস্যা পোস্ট করতে পারেন। যদি আপনি কোনও সমস্যা পোস্ট করার সিদ্ধান্ত নেন, তাহলে অনুগ্রহ করে সমস্ত অনুরোধকৃত তথ্য পূরণ করুন।