CodeMirror - вставлять текст в редактор, когда редакторов несколько

У меня на одной странице два редактора codemirror. Выпадающий список элементов и радиогруппа для выбора нужного редактора.

Что я хочу сделать, так это при изменении раскрывающегося списка вставить значение элемента в целевой редактор (удаленный радиогруппой).

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

<script type = "text/javascript"> 
    function editor(id) {
            var editor = CodeMirror.fromTextArea(id, {
                continuousScanning: 500,
                lineNumbers: true
            });
            editor.setSize(null, 550);
        }
    var config_id = document.getElementById('id_config')
    var config = editor(config_id);
    var remote_config_id = document.getElementById('id_remote_config')
    var remote_config = editor(remote_config_id);

    function insertStringInTemplate(str, target)    {
        if (target== "id_config") {
            var doc = config
        } else {
            var doc = remote_config
        }
            var cursor = doc.getCursor();
            var pos = {
                line: cursor.line,
                ch: cursor.ch
            }
            doc.replaceRange(str, pos);
        }

    $(function(){
        // bind change event to select
        $('#template_vars').on('change', function () {
            var var_data = $(this).val(); // get selected value
            var var_target = $('input[name=target]:checked').val();
            insertStringInTemplate(var_data, var_target)
            return false;
        });
    });
    $("#template_vars").chosen({no_results_text: "Oops, nothing found!"}); 
</script>
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
0
672
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

however the function to insert the text is failing

Этот function (т.е. insertStringInTemplate()) работает нормально / правильно; однако проблема связана с функцией editor(), в которой вы забыли вернуть editor (т.е. экземпляр CodeMirror).

Итак, простое исправление:

    function editor(id) {
            var editor = CodeMirror.fromTextArea(id, {
                continuousScanning: 500,
                lineNumbers: true
            });
            editor.setSize(null, 550);
            return editor; // <- here's the fix
        }

Демо на CodePen.

Однако в этой демонстрации, я добавил блок if к функции insertStringInTemplate(), как в следующем коде:

    function insertStringInTemplate(str, target)    {
        if (target== "id_config") {
            var doc = config
        } else {
            var doc = remote_config
        }

        // If there's a selection, replace the selection.
        if ( doc.somethingSelected() ) {
          doc.replaceSelection( str );
          return;
        }

        // Otherwise, we insert at the cursor position.
            var cursor = doc.getCursor();
            var pos = {
                line: cursor.line,
                ch: cursor.ch
            }
            doc.replaceRange(str, pos);
        }

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