Search code examples
blocklygoogle-blockly

Blockly: How to obtain value of a Dropdown or Checkbox Block


I´m new to Blockly and can not find a way to obtain field value of a dropdown or checkbox.

Lets consider following scenario (generated with blockly-dev-tools):

  Blockly.Blocks['feature'] = {
init: function () {
  this.appendDummyInput()
    .appendField("Feature") // just for label
    .appendField(new Blockly.FieldDropdown([["manufacturer", "feature_manufacturer"], ["profile", "feature_profile"], ["glas", "feature_glas"]]), "category"); // for dropdown values
  this.appendValueInput("feature_name")
    .setCheck("String")
    .setAlign(Blockly.ALIGN_RIGHT)
    .appendField("Name");
  this.appendValueInput("feature_prio")
    .setCheck("Number")
    .setAlign(Blockly.ALIGN_RIGHT)
    .appendField("Priorität");
  this.appendDummyInput()
    .setAlign(Blockly.ALIGN_RIGHT)
    .appendField("Versteckt")
    .appendField(new Blockly.FieldCheckbox("TRUE"), "hidden");

now obtaining values from value inputs is not a problem, you can get thouse like this:

const featureName = element.getInputTargetBlock("feature_name");
      if (featureName) {
        console.log(featureName.getFieldValue("TEXT"));
      }
const featurePrio = element.getInputTargetBlock("feature_prio");
      if (featurePrio) {
        console.log(featurePrio.getFieldValue("NUM"));
      }

but dummy inputs hosting dropdowns or checkboxes have no methods to provide selected values. It might be that this is my conceptual error to use dummy inputs to host the elements, but when using value input, you have always those nipples to the right, which are obsolate, since the values are provided by the checkbox or dropdown.


Solution

  • You should be able to skip the middleman and use element.getFieldValue. For example, to get the value from the checkbox field named "hidden", you could use element.getFieldValue("hidden").

    P.S. You can also skip the element.getInputTargetBlock middleman and use Blockly.JavaScript.valueToCode (I.E., to get the value of the block in the "feature_name" input, you could use Blockly.JavaScript.valueToCode(element, "featureName", Blockly.JavaScript.ORDER_ATOMIC) or what have you). If you use a different generator than JavaScript, replace JavaScript with the generator you use (e.g. Python or whatever).