# 下拉菜单字段

下拉菜单字段存储一个字符串作为其值,并存储一个字符串作为其文本。该值是一个语言中性键,将用于访问文本,不会在 Blockly 之间切换语言时进行翻译。该文本是用户可理解的字符串。

# 下拉菜单字段

# 打开编辑器的下拉字段

# 收起的块上的下拉字段

# 创建

下拉菜单构造函数可接受菜单生成器和可选的 校验器。菜单生成器具有很大的灵活性,但本质上是选项数组,每个选项都包含一个人类可读懂的部分和一个语言中性字符串。

# 简单的文本下拉菜单

Open dropdown with two text options

通过让人类可读的信息与语言中立键分开,可以在不同语言之间保留下拉菜单的设置。例如,英语版本的块可以定义 [['left', 'LEFT'], ['right', 'RIGHT]],而相同块的德语版本可以定义 [['links', 'LEFT'], ['rechts', 'RIGHT]]

# 图片下拉菜单

下拉菜单中的选项可能是图片,而不是文本。映像对象通过 srcwidthheightalt 属性指定。

请注意,尽管某个下拉列表可以同时包含文本选项和图片选项,但单个选项目前不能同时包含图片和文字。

Dropdown field containing images and text

# 动态下拉列表

Dropdown field with days of the week

系统还可以为函数提供下拉菜单,而不是静态列表,从而使选项可以动态变化。该函数应返回一个采用静态选项的 [human-readable-value, language-neutral-key] 格式的选项数组。每次点击下拉菜单,系统都会运行函数并重新计算选项。

TIP

注意:动态下拉菜单不会发生 前缀后缀匹配

# 序列化

# 自定义

# 下拉箭头

Blockly.FieldDropdown.ARROW_CHAR 属性可用于更改表示下拉箭头的 Unicode 字符。

Dropdown field with custom arrow

ARROW_CHAR 属性在 Android 上默认为 \u25BC (▼),在其他情况下默认为 \u25BE (▾)。

这是一个全局属性,因此会在设置时修改所有下拉菜单字段。

# 菜单高度

Blockly.FieldDropdown.MAX_MENU_HEIGHT_VH 属性可用于更改菜单的最大高度。它定义为视口高度的百分比,视口就是窗口。

MAX_MENU_HEIGHT_VH 属性默认为 0.45。

这是一个全局属性,因此会在设置时修改所有下拉菜单字段。

# 前缀后缀匹配

如果所有下拉菜单选项共用相同的前缀和/或后缀字词,系统会自动分离这些字词并将其作为静态文本插入。例如,您可以通过以下两种方法创建相同的块(第一种方式没有后缀匹配,第二种方式使用后缀):

没有后缀匹配:

使用后缀匹配时:

Dropdown field with "hello" as a label and "world", "computer" as options

这种方法的一个优势是,该代码块更易于翻译成其他语言。之前的代码具有字符串 'hello''world''computer',而修改后的代码具有字符串 'hello world''hello computer'。译员翻译短语的时间要比单独翻译短语容易得多。

这种方法的另一个优势是,字词顺序往往因语言而异。假设某个语言使用 'world hello''computer hello'。后缀匹配算法会检测通用 'hello',并在下拉菜单后面显示该匹配项。

但是,前缀/后缀匹配有时会失败。在某些情况下,两个单词应始终组合在一起,并且不应考虑前缀。例如,'drive red car''drive red truck' 应该只有 'drive' 被分解,而没有 'drive red'。Unicode 不间断空格 '\u00A0' 可以代替常规空格来抑制前缀/后缀匹配器。因此,可以使用 'drive red\u00A0car''drive red\u00A0truck' 修复上面的示例。

前缀/后缀匹配失败的另一个位置是语言,不以空格分隔各个字词。中文就是一个很好的例子。字符串 '訪問中國' 表示 'visit China',请注意字词之间缺少空格。后两个字符 ('中國') 共同表示 'China' 的单词,但如果拆分,这两个符号分别表示 'centre''country'。为了使前缀/后缀匹配在中文等语言中正常工作,只需在空格处插入一个空格即可。例如,'訪問 中國''訪問 美國' 会生成 "visit [China/USA]",而 '訪問 中 國''訪問 美 國' 会生成 "visit [centre/beautiful] country"

# 创建下拉菜单校验器

TIP

注意:如需查看有关校验器的一般信息,请参阅 校验器

下拉菜单字段的值是与语言无关的字符串,因此任何验证工具都必须接受字符串并返回字符串_这是一个可用选项_、nullundefined

如果校验器返回任何其他内容,Blockly 的行为将处于未定义状态,并且程序可能会崩溃。

例如,您可以使用三个选项和一个校验器定义下拉菜单字段,如下所示:

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