2017-02-14 2 views
3

Я пытаюсь импортировать Blockly (через узлоблочно из npm) в компонент VueJS, но часть javascript блока содержит вызовы getElementById(), что вызывает ошибку как document .getElementById() не доступен в VueJS.Импорт модуля, который использует getElementById в компоненте VueJS

Любая идея, как обойти это?

(Edit) Пример кода:

<template> 
<div class="hello"> 
    <div id="blocklyDiv" style="height: 480px; width: 600px;"> 
    </div> 
    <xml id="toolbox" ref=toolbox style="display: none"> 
    <block type="controls_if"></block> 
    <block type="text"></block> <block type="text_print"></block> 
    </xml> 
    </div> 
</template> 
<script> 
import Blockly from "node-blockly" 
export default { name: 'hello' } 
var workspace = Blockly.inject('blocklyDiv', {toolbox: document.getElementById('toolbox')}); 
</script> 
+0

Я не уверен, я понимаю. document.getElementById отлично работает с vue.js. Можете ли вы привести пример кода того, что не работает? – retrograde

+0

Я думаю, вы используете версию webpack, которая имеет eslint? Если да, то вам нужно разрешить браузер в eslintrc. Если это ваше дело, я отправлю ответ. –

+0

Я не выбрал eslint, когда создал проект webpack (используя vue cli). –

ответ

3

I supose является v2.

Try в mounted event

<template> 
 
<div class="hello"> 
 
    <div id="blocklyDiv" style="height: 480px; width: 600px;"> 
 
    </div> 
 
    <xml id="toolbox" ref=toolbox style="display: none"> 
 
    <block type="controls_if"></block> 
 
    <block type="text"></block> <block type="text_print"></block> 
 
    </xml> 
 
    </div> 
 
</template> 
 
<script> 
 
import Blockly from "node-blockly" 
 
export default { 
 
    name: 'hello', 
 
    data(){ 
 
    return { 
 
     workspace: null 
 
    } 
 
    }, 
 
    mounted(){ 
 
    this.workspace = Blockly.inject('blocklyDiv', {toolbox: document.getElementById('toolbox')}); 
 
    } 
 
} 
 
</script>

+0

Я боюсь, что это не изменило ситуацию. Функция getElementById() при вызове инъекции на самом деле не является проблемой. Это getElementById() в Blockly JS. Я предполагаю, что дополнительные элементы (xml, toolbox и т. Д.) Должны быть правильно зарегистрированы в качестве дочерних компонентов. Я попробую это и опубликую результаты здесь .... –

2

Предполагая, что вы используете VueJS версии 2, вы можете получить доступ ссылку на элемент с помощью this.$refs.myElement после мечения ваш элемент в шаблоне.

Пример:

<div ref="blocklyDiv" style="height: 480px; width: 600px;"> 

mounted() { 
    this.workspace = Blockly.inject(this.$refs.blocklyDiv); 
} 

Тогда просто сделать то же самое для вашей панели инструментов.

0

Это работает для меня

<script> 
export default { 
    mounted() { 
     console.log('blockly'); 
      var workspace = Blockly.inject('blocklyDiv', { 
      toolbox: document.getElementById('toolbox') 
      }); 

      var blocklyArea = document.getElementById('blocklyArea'); 
      var blocklyDiv = document.getElementById('blocklyDiv'); 

      var workspace = Blockly.inject(blocklyDiv, { 
       toolbox: document.getElementById('toolbox') 
      }); 

    .... 
}, 
+0

Обновление - этот подход не позволяет реализовать Blockly.JavaScript.workspaceToCode (рабочее пространство); Исследуя. – Dazzle

Смежные вопросы