Событие AddComment редактора Monaco запускается дважды - PullRequest
3 голосов
/ 12 мая 2019

Я настроил Monaco Editor для запуска события, когда Ctrl+S с использованием AddCommand :

<html>
<head>
    <meta charset="utf-8" />
    <style type="text/css">
        body {
            margin: 0;
            padding: 0;
        }
    </style>
</head>
<body>

    <div id="container" style="width:100%;height:700px;border:0px solid rgb(217, 219, 221);"></div>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.6/require.min.js"></script>
    <script src="{! URLFOR($Resource.monaco,'vs/loader.js')}"></script>

    <script>

        var editor;

        window.addEventListener("message", function (event) {

            let message = event.data;

            // stuff happens here that I've removed....

            let language = 'javascript';
            let code = 'no code found...';
            let readOnly = false;

            createEditor(code, language, readOnly);
        }, false);

        function createEditor(_code, _language, _readOnly) {

            var container = document.getElementById('container')
            while (container.firstChild) {
                container.removeChild(container.firstChild);
            }

            require.config({ paths: { "vs": "{! URLFOR($Resource.monaco,'vs')}" } });
            require(['vs/editor/editor.main'], function () {

                editor = monaco.editor.create(container, {
                    value: _code,
                    language: _language,
                    readOnly: _readOnly,
                });

                editor.addCommand(monaco.KeyMod.CtrlCmd | monaco.KeyCode.KEY_S, function () {
                    let message = {};
                    message.action = 'save';
                    parent.postMessage(message, "*");
                    console.log('saved!!');
                })

                window.onresize = function () {
                    editor.layout();
                };
            });

        }

        createEditor('', 'apex');

    </script>
</body>

</html>

Но событие запускается дважды.

Приведенный выше код выполняется внутри iframe.

Примечание: событие не выполняется, если я нажимаю только одну клавишу, оно срабатывает только при нажатии обеих клавиш.

Как я могуостановить событие дважды?

...