حقول القائمة المنسدلة

يخزن حقل القائمة المنسدلة سلسلة كقيمتها وسلسلة كنص لها. تشير رسالة الأشكال البيانية عبارة عن مفتاح محايد اللغة سيتم استخدامه للوصول إلى النص لن تتم ترجمة المحتوى عند تبديل تطبيق Blockly بين اللغات. النص هو سلسلة يمكن لشخص عادي قراءتها وسيتم عرضها للمستخدم

الإنشاء

تأخذ الدالة الإنشائية القائمة المنسدلة منشئ قائمة وحقل اختياري مدقق. يحتوي منشئ القائمة على الكثير من المرونة، لكنها في الأساس مجموعة من الخيارات، يحتوي كل خيار على وجزء يمكن للإنسان قراءته وسلسلة محايدة لغة.

قوائم منسدلة نصية بسيطة

فتح القائمة المنسدلة مع إضافة خيارَي النص

JSON

{
  "type": "example_dropdown",
  "message0": "drop down: %1",
  "args0": [
    {
      "type": "field_dropdown",
      "name": "FIELDNAME",
      "options": [
        [ "first item", "ITEM1" ],
        [ "second item", "ITEM2" ]
      ]
    }
  ]
}

JavaScript

Blockly.Blocks['example_dropdown'] = {
  init: function() {
    this.appendDummyInput()
        .appendField('drop down:')
        .appendField(new Blockly.FieldDropdown([
            ['first item', 'ITEM1'],
            ['second item', 'ITEM2']
        ]), 'FIELDNAME');
  }
};

إبقاء المعلومات التي يمكن للإنسان قراءتها منفصلة عن المفتاح المحايد اللغة للسماح بحفظ إعداد القائمة المنسدلة بين اللغات. بالنسبة على سبيل المثال، قد تحدِّد النسخة الإنجليزية من الحظر [['left', 'LEFT'], ['right', 'RIGHT]] بينما تحدِّد النسخة الألمانية من المجموعة نفسها السمة [['links', 'LEFT'], ['rechts', 'RIGHT]].

القوائم المنسدلة للصور

قد تكون الخيارات في القائمة المنسدلة أيضًا صورًا بدلاً من نص. كائنات الصور هي تم تحديدها باستخدام الخصائص src وwidth وheight وalt.

لاحظ أنه على الرغم من أن القائمة المنسدلة يمكن أن تحتوي على مزيج من خيارات النص وخيارات الصور، لا يمكن أن يتضمن خيار فردي صورةً ونصًا في الوقت الحالي.

حقل قائمة منسدلة يحتوي على صور ونص

JSON

{
  "type": "image_dropdown",
  "message0": "flag %1",
  "args0": [
    {
      "type": "field_dropdown",
      "name": "FLAG",
      "options": [
        ["none", "NONE"],
        [{"src": "canada.png", "width": 50, "height": 25, "alt": "Canada"}, "CANADA"],
        [{"src": "usa.png", "width": 50, "height": 25, "alt": "USA"}, "USA"],
        [{"src": "mexico.png", "width": 50, "height": 25, "alt": "Mexico"}, "MEXICO"]
      ]
    }
  ]
}

JavaScript

Blockly.Blocks['image_dropdown'] = {
  init: function() {
    var input = this.appendDummyInput()
        .appendField('flag');
    var options = [
        ['none', 'NONE'],
        [{'src': 'canada.png', 'width': 50, 'height': 25, 'alt': 'Canada'}, 'CANADA'],
        [{'src': 'usa.png', 'width': 50, 'height': 25, 'alt': 'USA'}, 'USA'],
        [{'src': 'mexico.png', 'width': 50, 'height': 25, 'alt': 'Mexico'}, 'MEXICO']
    ];
    input.appendField(new Blockly.FieldDropdown(options), 'FLAG');
  }
};

القوائم المنسدلة الديناميكية

حقل قائمة منسدلة يضم أيام الأسبوع

JSON

{
  "type": "dynamic_dropdown",
  "message0": "day %1",
  "args0": [
    {
      "type": "input_dummy",
      "name": "INPUT"
    }
  ],
  "extensions": ["dynamic_menu_extension"]
}
Blockly.Extensions.register('dynamic_menu_extension',
  function() {
    this.getInput('INPUT')
      .appendField(new Blockly.FieldDropdown(
        function() {
          var options = [];
          var now = Date.now();
          for(var i = 0; i < 7; i++) {
            var dateString = String(new Date(now)).substring(0, 3);
            options.push([dateString, dateString.toUpperCase()]);
            now += 24 * 60 * 60 * 1000;
          }
          return options;
        }), 'DAY');
  });

يتم ذلك باستخدام JSON الإضافة.

JavaScript

Blockly.Blocks['dynamic_dropdown'] = {
  init: function() {
    var input = this.appendDummyInput()
      .appendField('day')
      .appendField(new Blockly.FieldDropdown(
        this.generateOptions), 'DAY');
  },

  generateOptions: function() {
    var options = [];
    var now = Date.now();
    for(var i = 0; i < 7; i++) {
      var dateString = String(new Date(now)).substring(0, 3);
      options.push([dateString, dateString.toUpperCase()]);
      now += 24 * 60 * 60 * 1000;
    }
    return options;
  }
};

يمكن أيضًا توفير قائمة منسدلة مع دالة بدلاً من قائمة ، مما يتيح أن تكون الخيارات ديناميكية. يجب أن يكون ناتج الدالة مجموعة خيارات في [human-readable-value, language-neutral-key] نفسه والتنسيق كخيارات ثابتة. في كل مرة يتم فيها النقر على القائمة المنسدلة، تكون الدالة التشغيل وإعادة حساب الخيارات.

التسلسل

JSON

يبدو ملف JSON لحقل القائمة المنسدلة على النحو التالي:

{
  "fields": {
    "FIELDNAME": "LANGUAGE-NEUTRAL-KEY"
  }
}

حيث FIELDNAME هي سلسلة تشير إلى حقل قائمة منسدلة، تكون القيمة هي القيمة المراد تطبيقها على الحقل. يجب أن تكون القيمة مفتاح خيار محايد اللغة.

XML

يظهر رمز XML الخاص بحقل القائمة المنسدلة على النحو التالي:

<field name="FIELDNAME">LANGUAGE-NEUTRAL-KEY</field>

عندما تحتوي سمة name في الحقل على سلسلة تشير إلى قائمة منسدلة والنص الداخلي هو القيمة التي يجب تطبيقها على الحقل. الجزء الداخلي يجب أن يكون النص مفتاح خيار صالحًا ومحايدًا للغة.

التخصيص

يمكن استخدام السمة Blockly.FieldDropdown.ARROW_CHAR لتغيير حرف يونيكود يمثّل سهم القائمة المنسدلة.

حقل قائمة منسدلة بسهم مخصّص

يتم ضبط السمة ARROW_CHAR تلقائيًا على \u25BC (▼) على نظام التشغيل Android و\u25BE ( بإحدى القنوات (AE) وإلا.

هذه سمة عمومية، لذا ستعدِّل جميع حقول القائمة المنسدلة عند ضبطها.

يمكن استخدام السمة Blockly.FieldDropdown.MAX_MENU_HEIGHT_VH لتغيير الحد الأقصى لارتفاع القائمة. ويتم تحديده كنسبة مئوية من إطار العرض الارتفاع، إطار العرض هو النافذة.

وتكون القيمة التلقائية للسمة MAX_MENU_HEIGHT_VH هي 0.45.

هذه سمة عمومية، لذا ستعدِّل جميع حقول القائمة المنسدلة عند ضبطها.

مطابقة البادئة/اللاحقة

إذا كانت جميع خيارات القائمة المنسدلة تشترك في بادئة و/أو لاحقة مشتركة يتم تحليل هذه الكلمات تلقائيًا وإدراجها كنص ثابت. على سبيل المثال، إليك طريقتين لإنشاء نفس كتلة (هذه أولًا دون مع مطابقة اللاحقة، والثاني بـ):

بدون مطابقة لاحقة:

JSON

{
  "type": "dropdown_no_matching",
  "message0": "hello %1",
  "args0": [
    {
      "type": "field_dropdown",
      "name": "MODE",
      "options": [
        ["world", "WORLD"],
        ["computer", "CPU"]
      ]
    }
  ]
}

JavaScript

Blockly.Blocks['dropdown_no_matching'] = {
  init: function() {
    var options = [
      ['world', 'WORLD'],
      ['computer', 'CPU']
    ];

    this.appendDummyInput()
        .appendField('hello')
        .appendField(new Blockly.FieldDropdown(options), 'MODE');
  }
};

مع مطابقة اللاحقة:

JSON

{
  "type": "dropdown_with_matching",
  "message0": "%1",
  "args0": [
    {
      "type": "field_dropdown",
      "name": "MODE",
      "options": [
        ["hello world", "WORLD"],
        ["hello computer", "CPU"]
      ]
    }
  ]
}

JavaScript

Blockly.Blocks['dropdown_with_matching'] = {
  init: function() {
    var options = [
      ['hello world', 'WORLD'],
      ['hello computer', 'CPU']
    ];

    this.appendDummyInput()
        .appendField(new Blockly.FieldDropdown(options), 'MODE');
  }
};

حقل قائمة منسدلة مع

تتمثل إحدى مزايا هذا المنهج في أنه يسهل ترجمة الحظر إلى واللغات الأخرى. ويحتوي الرمز السابق على السلاسل 'hello' و'world' 'computer'، في حين أن التعليمة البرمجية التي تمت مراجعتها تحتوي على السلاسل 'hello world' 'hello computer' يتمتع المترجمون بسهولة أكبر في ترجمة العبارات مقارنةً الكلمات بمعزل عن بعضها.

تتمثل الفائدة الأخرى لهذا النهج في أن ترتيب الكلمات غالبًا ما يتغير بين اللغات. تخيل اللغة التي استخدمت 'world hello' و'computer hello'. سترصد خوارزمية مطابقة اللاحقة علامة 'hello' الشائعة وتعرضها. بعد القائمة المنسدلة.

ومع ذلك، يتعذّر أحيانًا مطابقة البادئة/اللاحقة. هناك بعض الحالات التي يجب دائمًا أن تتلاقى كلمتان ولا ينبغي حذف البادئة. على سبيل المثال، يمكن القول إن 'drive red car' و'drive red truck' يجب أن تتضمنا فقط تم طرح 'drive'، وليس 'drive red'. رموز يونيكود غير المنفصلة مسافة '\u00A0' بدلاً من المسافة العادية لمنع مطابقة البادئة/اللاحقة. وبالتالي يمكن إصلاح المثال أعلاه باستخدام "'drive red\u00A0car'" و'drive red\u00A0truck'"

مكان آخر يفشل فيه مطابقة البادئة/اللاحقة هي لغات لا فصل الكلمات الفردية بمسافات. اللغة الصينية هي مثال جيد. السلسلة '訪問中國' تعني 'visit China'، لاحظ عدم وجود مسافات بين الكلمات. وإجمالي الحرفين ('中國') هما كلمة 'China'، لكن في حال القسمة، يعني ذلك 'centre' و'country' على التوالي. لإجراء عمل مطابقة البادئة/اللاحقة في لغات مثل الصينية، فما عليك سوى إدراج مسافة حيث يجب أن يكون الفاصل الإعلاني. على سبيل المثال '訪問 中國' و ستؤدي '訪問 美國' إلى "visit [China/USA]"، بينما ستؤدي '訪問 中 國' و '訪問 美 國' سيؤدي إلى "visit [centre/beautiful] country".

إنشاء مدقق قائمة منسدلة

قيمة حقل القائمة المنسدلة هي سلسلة محايدة اللغة، لذلك يجب على أي أدوات تحقق قبول سلسلة وعرض سلسلة هذا هو الخيار المتاح، أو null، أو undefined

إذا عرض المدقق أي شيء آخر، فسيكون سلوك بلولي غير محدد فقد يتعطل برنامجك.

على سبيل المثال، يمكنك تحديد حقل قائمة منسدلة بثلاثة خيارات مدقّق كما يلي:

validate: function(newValue) {
  this.getSourceBlock().updateConnections(newValue);
  return newValue;
},

init: function() {
  var options = [
   ['has neither', 'NEITHER'],
   ['has statement', 'STATEMENT'],
   ['has value', 'VALUE'],
  ];

  this.appendDummyInput()
  // Pass the field constructor the options list, the validator, and the name.
      .appendField(new Blockly.FieldDropdown(options, this.validate), 'MODE');
}

تعرض الدالة validate دائمًا القيمة التي تم تجاوزها، لكنها تستدعي قيمة المساعدة. الدالة updateConnection التي تضيف أو تزيل المدخلات بناءً على القائمة المنسدلة القيمة:

updateConnections: function(newValue) {
  this.removeInput('STATEMENT', /* no error */ true);
  this.removeInput('VALUE', /* no error */ true);
  if (newValue == 'STATEMENT') {
    this.appendStatementInput('STATEMENT');
  } else if (newValue == 'VALUE') {
    this.appendValueInput('VALUE');
  }
}