Попытка сосредоточиться на компоненте codemirror внутри v-карты - PullRequest
0 голосов
/ 05 марта 2020

У меня проблемы с открытием компонента на комбинации клавиш и настройкой фокуса на этом компоненте.

У меня есть компонент Spotlight.vue, который отображается при определенной комбинации клавиш. Все работает хорошо, за исключением фокуса, где я, кажется, не могу установить фокус на зеркале кода, когда этот компонент находится внутри других компонентов - в моем случае, в диалоговом окне и на карточке.

После некоторых экспериментов я обнаружил, что аддон autorefresh и autofocus работают, но только если кодовое зеркало не находится внутри других компонентов.

Прожектор. vue

<template>
    <div>
    <v-row justify="center">
        <v-dialog
          v-model="dialog"
          max-width="1000"

        >
          <v-card>
            <codemirror v-autofocus
                        id="editor"
                        ref="editor"
                        v-if="dialog === true"
                        v-model="inputCode"
                        :options="cmOptions"
                        >
            </codemirror>
            <textarea v-model="output"/>
          </v-card>
        </v-dialog>
      </v-row>
      </div>
</template>

<script>
  import 'codemirror/addon/display/autorefresh.js'
  import 'codemirror/mode/python/python.js'
  import 'codemirror/theme/monokai.css'
  import'codemirror/addon/selection/active-line.js'
  import'codemirror/addon/selection/mark-selection.js'
  import'codemirror/addon/search/searchcursor.js'
  import'codemirror/addon/hint/show-hint.js'
  import'codemirror/addon/hint/show-hint.css'
  import'codemirror/addon/hint/javascript-hint.js'
  import'codemirror/addon/selection/active-line.js'
  import'codemirror/addon/scroll/annotatescrollbar.js'
  import'codemirror/addon/search/matchesonscrollbar.js'
  import'codemirror/addon/search/searchcursor.js'
  import'codemirror/addon/search/match-highlighter.js'
  import'codemirror/mode/clike/clike.js'
  import'codemirror/addon/edit/matchbrackets.js'
  import'codemirror/addon/comment/comment.js'
  import'codemirror/addon/dialog/dialog.js'
  import'codemirror/addon/dialog/dialog.css'
  import'codemirror/addon/search/searchcursor.js'
  import'codemirror/addon/search/search.js'
  import'codemirror/addon/search/search.js'
  import'codemirror/addon/display/autorefresh.js'
  import'codemirror/addon/display/placeholder.js'
  import'codemirror/keymap/sublime.js'
  import'codemirror/addon/fold/foldgutter.css'
  import'codemirror/addon/fold/brace-fold.js'
  import'codemirror/addon/fold/comment-fold.js'
  import'codemirror/addon/fold/foldcode.js'
  import'codemirror/addon/fold/foldgutter.js'
  import'codemirror/addon/fold/indent-fold.js'
  import'codemirror/addon/fold/markdown-fold.js'
  import'codemirror/addon/fold/xml-fold.js'

  export default {
    props: ["code"],
    components: {

    },
    data() {
      return {
        cmOptions: {
          autoCloseBrackets: true,
          tabSize: 4,
          indentUnit: 4,
          autoRefresh:true,
          autofocus: true,
          styleActiveLine: true,
          lineNumbers: true,
          line: true,
          mode: 'text/x-python',
          extraKeys: { "Ctrl": "autocomplete" },
          theme: "monokai",
          keyMap: "sublime",
        },
        dialog: false,
        inputCode: "",
        output: ""
    }
  },
  mounted() {
      let self = this
      this.$root.$on("call-spotlight", function() {
          if (!self.dialog) {
              self.dialog = true
              self.inputCode = ""
              self.output = "" 
          }
          else
              self.dialog = false
      })
  }
}
</script>

Вкл. main.js У меня есть прослушиватель событий для комбинации клавиш, отвечающих за показ прожектора.

main. js


new Vue({
  router,
  store,
  vuetify,
  mounted() {
      var self = this;
      window.addEventListener('keydown', function(e) {
          // eslint-disable-next-line
          if (e.shiftKey === true && e.code === "Space") {
              self.$root.$emit('call-spotlight')
          }
      })
  },
  render: h => h(App)
}).$mount('#app')

Затем прожектор регистрируется на Приложение. vue: Приложение. vue

<template>
  <v-app class="app" >
   <navigation-bar />
   <spotlight />
  </v-app>
</template>

Цель состоит в том, чтобы при Shift + Пробел открыть диалог и сосредоточиться на компоненте codemirror.

...