Добавление вызова API в JS-интерпретатор для использования с пользовательским блочным блоком

Я хочу предвосхитить это, говоря, что я новичок в JavaScript, и, конечно же, использую JS-интерпретатор Neil Fraser.

Я сделал несколько пользовательских блоков, которые просто создают JavaScript, который когда eval() помещает объект своего типа блока и пользовательские вводы в массив.

Функция, которую они используют для этого, называется pushInstruction (blockName, input); где input - массив пользовательских входов блоков, а blockName - имя блока.

Сейчас я пытаюсь использовать JS-интерпретатор, но проблема в том, как мне использовать эти блоки вместе с ним.

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

Пользовательский код блока

Blockly.Blocks['select_hand_position'] = {
  init: function() {
    this.appendDummyInput()
        .appendField("Move");
    this.appendDummyInput()
        .appendField(new Blockly.FieldDropdown([["left hand","Left hand"], ["right hand","Right hand"]]), "handSelect")
        .appendField("to index")
        .appendField(new Blockly.FieldNumber(0), "indexSelect");
    this.setPreviousStatement(true, null);
    this.setNextStatement(true, null);
    this.setColour(290);
 this.setTooltip("");
 this.setHelpUrl("");
  }
};
Blockly.JavaScript['select_hand_position'] = function(block) {
  var dropdown_handselect = block.getFieldValue('handSelect');
  var number_indexselect = block.getFieldValue('indexSelect'); 
  var input = '["'+dropdown_handselect+'",'+number_indexselect+']';
  var code = 'pushInstruction("select_hand_position",'+input+');'               
  return code;
};

У меня есть глобальный массив для хранения объектов

instructionStructure = new Array();

который затем используется в этой функции, из которой блоки генерируют код для использования.

function pushInstruction(blockName,inputs) {  
  var instruction = null;
  switch(blockName) {
    case "place_book":
    case "grab_book":
    case "select_hand_position":
      instruction = {
        blockName: blockName,
        hand: inputs[0],
        index: inputs[1].toString()
      };
      instructionStructure.push(instruction);
      break;

    default:
      throw 'attempted to push unknown instruction block';
  }       
} 

Код шага

вот код, который запускается при нажатии кнопки кнопки шага

function stepCode() {
  Blockly.JavaScript.STATEMENT_PREFIX = 'highlightBlock(%1);\n';
  Blockly.JavaScript.addReservedWords('highlightBlock');
  var code = Blockly.JavaScript.workspaceToCode(workspace);
  var myInterpreter = new Interpreter(code, initApi);
  function nextStep() {
    if (myInterpreter.step()) {
      window.setTimeout(nextStep, 1000);
    }
  }
  nextStep();
  alert(instructionStructure);
}

функция initAPI

это где я продолжаю получать

Uncaught TypeError: Interpreter.setProperty не является функцией

на линии

Interpreter.setProperty(scope, 'pushInstruction', interpreter.createNativeFunction(wrapper));

function initApi(interpreter, scope) {

  var wrapper = function(id) {
    id = id ? id.toString() : '';
    return interpreter.createPrimitive(highlightBlock(id));
  };
  interpreter.setProperty(scope, 'highlightBlock',
      interpreter.createNativeFunction(wrapper));


  wrapper = function(blockName, inputs) {
    return pushInstruction(blockName,inputs);
  };
  Interpreter.setProperty(scope, 'pushInstruction',
      interpreter.createNativeFunction(wrapper));  
}

Спасибо, что потратили время, чтобы прочитать это, я очень ценю это!

1 ответ

Решение

У вас есть опечатка здесь:

Interpreter.setProperty(scope, 'pushInstruction',
  interpreter.createNativeFunction(wrapper));  

=>

interpreter.setProperty(scope, 'pushInstruction',
  interpreter.createNativeFunction(wrapper));  

Это для Uncaught TypeError, Это единственная проблема здесь? Потому что я на самом деле не получил

но проблема в том, как мне использовать эти блоки вместе с ним.

Другие вопросы по тегам