जुलाई 2019 में (रिलीज़ 2.20190722) ज़्यादा कोडिफ़ाइड फ़ील्ड एपीआई जोड़ा गया. इसका मकसद पुराने सिस्टम के साथ काम करने की सुविधा होनी चाहिए. इसका मतलब यह है कि अगर आपने किसी कस्टम फ़ील्ड को जुलाई 2019 से पहले सेट करना होगा, ताकि यह काम करता रहे. आपके कस्टम फ़ील्ड को अपग्रेड करने की ज़रूरत है या नहीं, यह तय करने से पहले आपको खतरे की जगहें सेक्शन में जाएं और अपने फ़ील्ड की अच्छी तरह से जांच करें.
क्योंकि जुलाई 2019 से पहले फ़ील्ड के लिए मानक तय नहीं किया गया था उन सभी बदलावों को कवर करना पेचीदा होता है, जिन्हें डेवलपर को करने की ज़रूरत पड़ सकती है. इस दस्तावेज़ में सभी संभावित बदलावों को शामिल करने की कोशिश की गई है. हालांकि, अगर दस्तावेज़ में कोई समस्या नहीं है, तो अपनी रुचि के बारे में बताने के लिए, कृपया अपग्रेड करने में मदद पाना.
खतरे वाली जगहें
खतरे वाली जगहें ऐसी जानी-पहचानी जगहें होती हैं जहां एपीआई में बदलाव हुआ है. इसलिए, आपका फ़ील्ड काम नहीं कर रहा है.
Blockly.Field.register
फ़ील्ड को अब Blockly.Field.register();
के ज़रिए रजिस्टर नहीं किया जाता है. यहां है
अब एक fieldRegistry नेमस्पेस है, जो रजिस्ट्रेशन को मैनेज करता है.
Blockly.Field.register('my_field_name', myFieldClass);
बनने वाला है:
Blockly.fieldRegistry.register('my_field_name', myFieldClass);
setText
ब्लॉकली कोर, अब 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
). - फ़ील्ड यूज़र इंटरफ़ेस (यूआई)
सुझाए गए अपग्रेड
सुझाए गए अपग्रेड ऐसे स्थान हैं जहां फ़ील्ड 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.
ऊपर दी गई चेतावनी का मतलब है कि Blockly का मानना है कि आपको
फ़ील्ड को क्रम से लगाना होगा (क्योंकि EDITABLE
प्रॉपर्टी सही है), लेकिन
पक्का नहीं हो सकता कि जब तक आप SERIALIZABLE
प्रॉपर्टी तय न करें. अगर आप
इसे छोड़ दें, तो सब कुछ ठीक से काम करेगा और आपका फ़ील्ड
क्रम में लगाया गया है, लेकिन आपको कंसोल से जुड़ी चेतावनियां मिलेंगी.
size_.width
this.size_.width = 0;
बनने वाला है:
this.isDirty_ = true;
नीचे दी गई चेतावनी को अनदेखा किया जा सकता है, लेकिन आप isDirty_
को सेट करके इसे ठीक कर सकते हैं
के बजाय size_.width
प्रॉपर्टी:
Deprecated use of setting size_.width to 0 to rerender a field. Set
field.isDirty_ to true instead.
ऊपर दी गई चेतावनी का मतलब है कि Blockly को पता चला है कि आपने किसी फ़ाइल को फ़ील्ड में डालें और क्या आप नई विधि का उपयोग करना चाहेंगे.
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_);
};
इसका मतलब है कि अब ये सब ब्लॉक अपने-आप ही मैनेज हो जाते हैं:
- यह देखना कि फ़ील्ड पहले से शुरू है या नहीं.
fieldGroup_
बनाया जा रहा है.- फ़ील्ड रेंडर हो रहा है.
- टूलटिप बाइंड करना और एडिटर इवेंट दिखाना.
आपको इनकी ज़रूरत होगी:
- अतिरिक्त वैल्यू जोड़ी जा रही है
DOM एलिमेंट (
initView
). - अतिरिक्त वैल्यू जोड़ी जा रही है
इवेंट बाइंडिंग (
bindEvents_
). - इवेंट बाइंडिंग का निवारण करना (
dispose
).
onMouseDown_
CustomFields.UpgradeField.prototype.onMouseDown_ = function(e) {
// ...
};
बनने वाला है:
CustomFields.UpgradeField.prototype.showEditor_ = function() {
// ...
}
हमारा सुझाव है कि माउस को हैंडल करने के लिए, showEditor_
फ़ंक्शन को बदलें
onMouseDown_
फ़ंक्शन के बजाय क्लिक, जो इनपुट को पास करने की अनुमति देता है
के लिए इस्तेमाल किया जाता है.
एडिटर के बारे में ज़्यादा जानकारी के लिए, एडिटर लेख पढ़ें.
setValue
setValue
फ़ंक्शन अब एक टेंप्लेट है
फ़ंक्शन से
सब-क्लास में डुप्लीकेट कोड कम करना. अगर आपके setValue
फ़ंक्शन में लॉजिक है,
इसमें बताए गए वैल्यू हैंडलिंग पाथ के हिसाब से, इसे रीफ़ैक्टर करें
वैल्यू मैनेज करना.
text_
हमारा सुझाव है कि आप कभी भी अपनी text_
प्रॉपर्टी को ऐक्सेस या अपडेट न करें
फ़ील्ड में सीधे शामिल कर सकते हैं. इसके बजाय,
getText फ़ंक्शन
आपके फ़ील्ड के उपयोगकर्ता के पढ़ने लायक टेक्स्ट को ऐक्सेस करने के लिए और
setValue फ़ंक्शन
ताकि आप अपने फ़ील्ड की सेव की गई वैल्यू को अपडेट कर सकें.
फ़ील्ड की वैल्यू और उसके टेक्स्ट के बारे में ज़्यादा जानने के लिए, किसी फ़ील्ड की बनावट.
अपग्रेड करने में मदद पाएं
क्या उपलब्ध कराएं
सहायता मांगने के दौरान कुछ खास सवाल पूछना बेहतर होता है:
इसका सुझाव नहीं दिया जाता: "इस फ़ील्ड में क्या गलत है?"
इसका सुझाव भी नहीं दिया जाता: "इस फ़ील्ड को अपग्रेड करने में मेरी मदद करो."
सुझाया गया: "फ़ील्ड का टेक्स्ट ठीक से अपडेट नहीं हो रहा है."
आपकी मदद करने वाले लोगों को संसाधन उपलब्ध कराना भी ज़रूरी है. ये फ़ाइलें ऐसी होनी चाहिए जिन्हें दूसरे लोग आसानी से इस्तेमाल कर सकें.
इनका सुझाव नहीं दिया जाता:
- कोड की इमेज.
- अधूरा कोड.
सुझाया गया:
- फ़ील्ड कोड को टेक्स्ट फ़ॉर्मैट में भरें.
- खराब फ़ील्ड व्यवहार वाले GIF की इमेज.
- फ़ील्ड की खराब परफ़ॉर्मेंस दिखाने का तरीका.
- Blockly का वह वर्शन जिससे आप अपग्रेड कर रहे हैं.
कहां पोस्ट करें
ब्लॉक किए गए डेवलपर पर अपग्रेड से जुड़े सवाल पोस्ट करें फ़ोरम में भी देख सकते हैं.
अगर आपको लगता है कि समस्या ब्लॉकली कोर की है, तो साथ ही, कोई समस्या पोस्ट करें को ब्लॉक किया है. अगर आपको कोई समस्या पोस्ट करनी है, तो कृपया मांगी गई जानकारी.