Как мне получить значение в событии onchange пользовательского блока Blockly?

Я создаю собственный блок для Blockly, и мне нужно проверить вводимые данные. В событии onchange я хочу предупредить пользователя, если он вводит недопустимое значение для ввода.

Вот мой блок:

введите описание изображения здесь

Blockly.Blocks['motor'] = {
    init: function() {
        this.setHelpUrl('http://www.example.com/');
        this.setColour(65);
        this.appendDummyInput()
            .appendField("motor( ");
        this.appendValueInput("port_number")
            .setCheck("Number");
        this.appendDummyInput()
            .appendField(");");
        this.setInputsInline(true);
        this.setPreviousStatement(true);
        this.setNextStatement(true);
        this.setTooltip('');
    },
    onchange: function(ev) {
        if (this.getFieldValue('port_number') > '3') {
            this.setWarningText('Port must be 0 - 3.');
        } else {
            this.setWarningText(null);
        }
    }
};

На странице блочных разработчиков есть базовый пример получение входного значения. Однако я продолжаю получать undefined, возвращаемый каждый раз, когда onchange срабатывает.

Как я могу выполнить проверку этих входных данных? Я не хочу создавать раскрывающийся список для ввода, потому что мне нужно иметь возможность вводить данные из переменных, блоков int и т. Д.


person swatkins    schedule 03.05.2015    source источник
comment
Вы решили это? Если у вас есть, пожалуйста, опубликуйте. Если нет, вы всегда можете выполнить console.log (this), чтобы узнать, что происходит; или, еще лучше, установите точку останова и оцените. Или, в некоторых случаях, вы можете использовать var block = Blockly.selected;   -  person Irina Rapoport    schedule 14.05.2015
comment
@ ТаняТ. Спасибо за помощь, ваш комментарий заставил меня определить, как вытащить значение ввода!   -  person swatkins    schedule 15.05.2015
comment
Вы использовали Blockly.selected? А вы знаете, какой у вас был this?   -  person Irina Rapoport    schedule 16.05.2015
comment
@ ТаняТ. Мне не понадобился Blockly.selected, потому что у меня уже был экземпляр блока. this был тем экземпляром.   -  person swatkins    schedule 18.05.2015


Ответы (2)


Не уверен, что это лучший способ справиться с этим, но у меня он работает. Я просто получаю доступ к входному значению с помощью метода valueToCode. Затем я могу проверить введенное значение.

Примечание. Контекст обработчика onchange - это блок, поэтому передача this в качестве первого аргумента функции Blockly.C.valueToCode приведет к получению значения из правильного блока.

Blockly.Blocks['motor'] = {
    init: function() {
        this.setHelpUrl('http://www.example.com/');
        this.setColour(65);
        this.appendDummyInput()
            .appendField("motor( ");
        this.appendValueInput("port_number")
            .setCheck("Number");
        this.appendDummyInput()
            .appendField(");");
        this.setInputsInline(true);
        this.setPreviousStatement(true);
        this.setNextStatement(true);
        this.setTooltip('');
    },
    onchange: function(ev) {
        var port_number = Blockly.C.valueToCode(this, 'port_number', Blockly.C.ORDER_ATOMIC);
        var valid = VALIDATE.motor_port_number(port_number);
        if (!valid) 
            alert("WARNING: The value for the motor port must be 0, 1, 2 or 3.");
        }
    }
};
person swatkins    schedule 15.05.2015

Попробуй это:

this.getInputTargetBlock('port_number').toString()

Or:

this.getInputTargetBlock('port_number').getFieldValue(/*field_name*/)

Пример:

   Blockly.Blocks['stop_actions'] = {
    init: function() {
        var actions_descriptors = [
            ['HOLD', 'hold'],
            ['COAST', 'coast']
        ];
        this.appendDummyInput()
            .appendField(new Blockly.FieldDropdown(actions_descriptors), 'action')
            .setAlign(Blockly.ALIGN_RIGHT);
        this.setOutput(true, 'String');
        this.setColour(60);
        this.setTooltip('Select the stop action');
    }
};

Blockly.Blocks['motor'] = {
    init: function() {
        this.appendValueInput('arg_stop_action')
            .appendField('Stop action')
            .setAlign(Blockly.ALIGN_RIGHT);
    },

    onchange: function(e) {
        this.getInputTargetBlock('arg_stop_action').getFieldValue('action')
    }
};
person isnullxbh    schedule 21.02.2018