कस्टम फ़ील्ड को अपग्रेड करना

जुलाई 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 फ़ंक्शन को अब Blockly कोर नहीं कॉल करता है. इसलिए, अगर आपके 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_;
}

ब्लॉक रूप से अपने-आप हैंडल करता है:

  • जांच की जा रही है कि नई वैल्यू, पुरानी वैल्यू से अलग है या नहीं.
  • वैल्यू अपडेट की जा रही है.
  • बदलाव इवेंट फ़ायर करना.
  • फ़ील्ड को फिर से रेंडर किया जा रहा है.

आपको इन्हें मैनेज करना होगा:

सुझाए गए अपग्रेड वे जगहें हैं जहां फ़ील्ड एपीआई को बदला गया है. हालांकि, अगर आपने बदलाव नहीं किया है, तो हो सकता है कि आपका फ़ील्ड अब भी काम करेगा.

क्रम से लगाया जा सकता है

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;

नीचे दी गई चेतावनी को अनदेखा किया जा सकता है. हालांकि, इसे ठीक करने के लिए, size_.width प्रॉपर्टी के बजाय isDirty_ प्रॉपर्टी को सेट किया जा सकता है:

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_ बनाया जा रहा है.
  • फ़ील्ड रेंडर हो रहा है.
  • टूलटिप और एडिटर इवेंट दिखाएं.

आपको इन्हें मैनेज करना होगा:

onMouseDown_

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

इनमें से बन जाते हैं:

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

हमारा सुझाव है कि आप माउस क्लिक को हैंडल करने के लिए, onMouseDown_ फ़ंक्शन के बजाय showEditor_ फ़ंक्शन को बदलें, क्योंकि इससे इनपुट को जेस्चर सिस्टम से पास किया जा सकता है.

एडिटर के बारे में ज़्यादा जानकारी के लिए, एडिटर पेज पर जाएं.

setValue

सब-क्लास में डुप्लीकेट कोड को कम करने के लिए, अब setValue फ़ंक्शन एक टेंप्लेट है. अगर आपके setValue फ़ंक्शन में लॉजिक है, तो इसे फिर से तैयार करें, ताकि वैल्यू हैंडलिंग में बताए गए पाथ का इस्तेमाल किया जा सके.

text_

हमारा सुझाव है कि आप कभी भी अपने फ़ील्ड की text_ प्रॉपर्टी को सीधे तौर पर ऐक्सेस या अपडेट न करें. इसके बजाय, getText फ़ंक्शन का इस्तेमाल करें, ताकि उपयोगकर्ता आपके फ़ील्ड के उस टेक्स्ट को ऐक्सेस कर सकें जिसे पढ़ा जा सकता है. इसके अलावा, फ़ील्ड की स्टोर वैल्यू को अपडेट करने के लिए, setValue फ़ंक्शन का इस्तेमाल करें.

फ़ील्ड की वैल्यू और उसके टेक्स्ट के बारे में ज़्यादा जानकारी के लिए, फ़ील्ड की बनावट देखें.

अपग्रेड करने में मदद पाना

क्या उपलब्ध कराएं

सहायता मांगने के लिए इन बातों का ध्यान रखें:

इसका सुझाव नहीं दिया जाता: "इस फ़ील्ड में क्या गलत है?"

इसका सुझाव भी नहीं दिया जाता: "इस फ़ील्ड को अपग्रेड करने में मेरी मदद करें."

सुझाव: "फ़ील्ड टेक्स्ट ठीक से अपडेट नहीं हो रहा है."

आपकी मदद कर रहे लोगों को संसाधन उपलब्ध कराना भी ज़रूरी है. ये फ़ाइलें दूसरों के लिए इस्तेमाल में आसान होनी चाहिए.

इसका सुझाव नहीं दिया जाता:

  • कोड की इमेज.
  • कोड अधूरा है.

सुझाया गया:

  • फ़ील्ड कोड को टेक्स्ट फ़ॉर्मैट में भरें.
  • फ़ील्ड के खराब व्यवहार वाले GIF की इमेज.
  • फ़ील्ड के खराब व्यवहार को फिर से दिखाने का तरीका.
  • ब्लॉकली का वह वर्शन जिससे आप अपग्रेड कर रहे हैं.

कहां पोस्ट करें

ब्लॉक किए गए डेवलपर फ़ोरम पर अपग्रेड से जुड़े सवाल पोस्ट करें.

अगर आपको यकीन है कि यह समस्या ब्लॉकली कोर की वजह से है, तो ब्लॉकली GitHub पर समस्या पोस्ट करें. अगर आपको कोई समस्या पोस्ट करनी है, तो कृपया अनुरोध की गई सभी जानकारी भरें.