Açılır alanlar

Açılır alanda bir dize değeri ve metin olarak depolanır. İlgili içeriği oluşturmak için kullanılan value, metne erişmek için kullanılacak dilden bağımsız bir anahtardır ve Blockly diller arasında geçiş yaptığında çevrilmez. Metin, kullanıcının okuyabileceği bir dizedir.

içerik üretimi

Açılır liste oluşturucu, bir menü oluşturucuyu ve isteğe bağlı bir doğrulayıcı. Menü oluşturucuda çok sayıda ama aslında bu, her biri farklı bir işleve sahip olan okunabilir bir bölümü olur ve dilden bağımsız bir dize belirtir.

Basit metin açılır listeleri

İki metin seçeneği içeren açılır listeyi aç

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');
  }
};

Kullanıcıların okuyabileceği bilgileri, dil içermeyen anahtardan ayrı tutmak açılır menünün ayarının diller arasında korunmasını sağlar. Örneğin, bir bloğun İngilizce sürümü [['left', 'LEFT'], ['right', 'RIGHT]] öğesini tanımlarken, aynı blokun Almanca sürümü [['links', 'LEFT'], ['rechts', 'RIGHT]] öğesini tanımlayabilir.

Resim açılır listeleri

Açılır menüdeki seçenekler metin yerine resim de olabilir. Resim nesneleri src, width, height ve alt özellikleriyle belirtilir.

Açılır menüde metin ve resim seçeneklerinin karışık olarak bulunabileceğini unutmayın. tek bir seçenek şu anda hem resim hem de metin içeremez.

Resim ve metin içeren açılır alan

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');
  }
};

Dinamik açılır listeler

Haftanın günlerini içeren açılır liste alanı

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');
  });

Bu işlem JSON kullanılarak yapılır uzantı'yı seçin.

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;
  }
};

Açılır liste, statik bir liste yerine bir fonksiyon da sağlayabilir kullanabilirsiniz. Bu, seçeneklerin dinamik olmasını sağlar. İşlev, aynı [human-readable-value, language-neutral-key] içindeki seçenekler dizisi biçimini kullanabilirsiniz. Açılır menü her tıklandığında, işlev ve seçenekler yeniden hesaplanır.

Serileştirme

JSON

Açılır liste alanının JSON'u aşağıdaki gibi görünür:

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

Burada FIELDNAME, açılır alana referans veren bir dizedir ve değer, alana uygulanacak değerdir. Değer şöyle olmalıdır: dil içermeyen seçenek tuşuna basın.

XML

Açılır liste alanı için XML aşağıdaki gibi görünür:

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

Alanın name özelliği, açılır listeye referans veren bir dize içerdiğinde alanı, iç metin ise alana uygulanacak değerdir. İç metin, geçerli bir dilden bağımsız seçenek anahtarı olmalıdır.

Özelleştirme

Blockly.FieldDropdown.ARROW_CHAR özelliği, açılır oku temsil eden unicode karakteri.

Özel ok bulunan açılır liste alanı

ARROW_CHAR özelliği, Android'de varsayılan olarak \u25BC (▼) ve \u25BE (▾) değerine ayarlanır. aksi takdirde.

Bu global bir mülktür, bu nedenle ayarlandığında tüm açılır listeler değiştirilir.

Blockly.FieldDropdown.MAX_MENU_HEIGHT_VH özelliği, menünün maksimum yüksekliğine eşittir. Görüntü alanının yüzdesi olarak tanımlanır yükseklik, görüntü alanının pencere olduğu anlamına gelir.

MAX_MENU_HEIGHT_VH özelliğinin varsayılan değeri 0,45'tir.

Bu global bir mülktür, bu nedenle ayarlandığında tüm açılır listeler değiştirilir.

Önek/sonek eşleştirme

Tüm açılır menü seçenekleri ortak ön ek ve/veya son eki paylaşıyorsa bu kelimeler otomatik olarak dışlanır ve statik metin olarak eklenir. Örneğin, burada aynı bloku oluşturmanın iki yolu (bu ilk önce sonek eşleşmesi ve ikincisinde şunlar bulunur):

Sonek eşleştirme yapılmazsa:

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');
  }
};

Sonek eşleştirmeyle:

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');
  }
};

Açılır liste

Bu yaklaşımın avantajlarından biri, blokun çevrilmesi daha kolay olmasıdır. yardımcı olur. Önceki kod; 'hello', 'world' ve 'computer', düzeltilmiş kod ise 'hello world' ve dizelerini içerir. 'hello computer'. Çevirmenler de kelime öbeğini çevirmeye kıyasla, somut olarak ortaya koyar.

Bu yaklaşımın başka bir avantajı da, kelime sırasının dil. 'world hello' ve 'computer hello' kullanılan bir dil düşünün. Sonek eşleştirme algoritması, yaygın 'hello' ifadesini algılar ve gösterir tıklayın.

Ancak bazen ön ek/sonek eşleştirmesi başarısız olur. Bazı durumlarda iki kelime her zaman birlikte gelmeli ve önek dikkate alınmamalıdır. Örneğin 'drive red car' ve 'drive red truck' muhtemelen yalnızca 'drive red' değil 'drive' dikkate alınır. Unicode'da bölünmez '\u00A0' boşluğu, normal bir boşluk yerine bu alanın önek/sonek eşleştiricisi. Dolayısıyla, yukarıdaki örnek 'drive red\u00A0car' ve 'drive red\u00A0truck'.

Önek/sonek eşleştirmenin başarısız olduğu bir başka nokta da sözcükleri boşluklarla ayırın. Çince iyi bir örnek. Dize '訪問中國', 'visit China' anlamına gelir. Kelimeler arasında boşluk olmamasına dikkat edin. Toplu olarak son iki karakter ('中國') 'China' kelimesidir, ancak bölündüğünde sırasıyla 'centre' ve 'country' anlamına gelir. Şunun için: gibi dillerde yazılmış ön ek/sonek eşleştirmesi boşluk ekleyin. Örneğin '訪問 中國' ve '訪問 美國' metriği "visit [China/USA]", '訪問 中 國' ve '訪問 美 國' sonucu "visit [centre/beautiful] country" olur.

Açılır liste doğrulayıcı oluşturma

Açılır liste alanının değeri dilden bağımsız bir dizedir. Bu nedenle tüm doğrulayıcılar bir dizeyi kabul eder ve kullanılabilir bir seçenek olan null veya undefined.

Doğrulayıcınız başka bir değer döndürürse Blockly'nin davranışı tanımlanmamış olur ve kilitlenebilir.

Örneğin, üç seçenek ve bir şuna benzer:

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, her zaman geçirildiği değeri döndürür ancak yardımcıyı çağırır açılır listeye göre girişleri ekleyen veya kaldıran updateConnection işlevi değer:

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');
  }
}