目录

前言

引入依赖

Html 容器

内嵌 JS 编写

相关资源

自动补全设置默认关键字

修改 MIME 配置

位置

代码

设置 Key 关键字

效果:

自定义补全表联想

效果

问题

解决

动态 JS 对象属性和值设置

js 对象动态设置效果

前言

  目前编者已知有两种方法:1、修改 MIME 配置;2、动态修改参数配置。第一种时候设置关键字,比如说 where , select。第二种适合动态的表关联结构。

引入依赖

<script src="lib/codemirror.js"></script>

<link rel="stylesheet" href="/lib/codemirror.css">

Html 容器

<template>

  <textarea id="mycode" class="codesql" v-model="code" style="height:200px;width:600px;border: red solid 2px;"></textarea>

</template>

内嵌 JS 编写

window.onload = function () {  

            var mime = 'text/x-flinksql';  

            this.editor = CodeMirror.fromTextArea(document.getElementById('code'), {  

                mode: mime,   //指向引入的model/sql.js里面的'text/x-flinksql'【defineMime】

                indentWithTabs: true,  

                smartIndent: true,  

                styleActiveLine: true,  

                lineNumbers: true,  

                lineWrapping: true,  

                matchBrackets: true,  

                autofocus: true,  

                extraKeys: {"Ctrl-Space": "autocomplete"},  

//              hintOptions的tables属性里面就是我们具体要提示的内容

                hintOptions: {  

                    tables: sqlresult.data.filedArr  

                }  

            });  

            this.editor.on("keyup", function (cm, event) {  

                //所有的字母和'$','{','.'在键按下之后都将触发自动完成  

                if (!cm.state.completionActive &&  

                        ((event.keyCode >= 65 && event.keyCode <= 90 ) || event.keyCode == 52 || event.keyCode == 219 || event.keyCode == 190)) {  

                    CodeMirror.commands.autocomplete(cm, null, {completeSingle: false});  

                }  

            });

        

        };  

相关资源

按需引入

<script src="../../js/codemirror/lib/codemirror.js"></script>  

<script src="../../js/codemirror/mode/sql/sql.js"></script>

<link rel="stylesheet" href="../../js/codemirror/addon/hint/show-hint.css"/>  

<script src="../../js/codemirror/addon/hint/show-hint.js"></script>  

<script src="../../js/codemirror/addon/hint/sql-hint.js"></script>  

<script src="../../js/codemirror/addon/selection/active-line.js"></script>

自动补全设置默认关键字

修改 MIME 配置

位置

   sql 文件夹里面的 sql.js

代码

  //flinksql
  CodeMirror.defineMIME("text/x-flinksql", {
    name: "sql",
    client: set("source"),
    keywords: set("for null true false TUMBLE_ROWTIME MINUTE HOUR INTERVAL select from table with group by order and or DATE_FORMAT TIMESTAMP FROM_TIMESTAMP  FUNCTION VIEW INSERT  INTO WHERE JOIN HAVING DISTINCT ALL SUM UNION ALL PARTITION OVER AS DESC ASC COUNT SUBSTRING type project"),
    builtin: set("VARCHAR INT BIGINT DOUBLE DATE BOOLEAN TINYINT SAMLLINT FLOAT DECIMAL VARBINARY"),
    atoms: set("false true null"),
    operatorChars: /^[*+\-%<>!=&|^\/#@?~]/,
    dateSQL: set("time"),
    support: set("decimallessFloat zerolessFloat binaryNumber hexNumber")
  });
});

设置 Key 关键字

效果:

自定义补全表联想

window.onload = function () {  
            var mime = 'text/x-flinksql';  
            this.editor = CodeMirror.fromTextArea(document.getElementById('code'), {  
                mode: mime,  
                indentWithTabs: true,  
                smartIndent: true,  
                styleActiveLine: true,  
                lineNumbers: true,  
                lineWrapping: true,  
                matchBrackets: true,  
                autofocus: true,  
                extraKeys: {"Ctrl": "autocomplete"},  
//              hintOptions的tables属性里面就是我们具体要提示的内容:key是表名称,value是字段
                hintOptions: {  
                 completeSingle: false,
                     tables: {
                      csdn: ['cbry', 'like', 'follow'],
				      blogChina: [],
				      com: ['alibaba','uu','ireader']
                  }
                }  
            });  
            this.editor.on("keyup", function (cm, event) {  
                //所有的字母和'$','{','.'在键按下之后都将触发自动完成  
                if (!cm.state.completionActive &&  
                        ((event.keyCode >= 65 && event.keyCode <= 90 ) || event.keyCode == 52 || event.keyCode == 219 || event.keyCode == 190)) {  
                    CodeMirror.commands.autocomplete(cm, null, {completeSingle: false});  
                }  
            });
        
        };  

效果

问题

属性设置无法直接识别变量, 即动态数据表关联。

hintOptions 里面的 tables 中,是否加 "" 不要影响设置:

“csdn”: [‘cbry’, ‘like’, ‘follow’]                        等价于               csdn: [‘cbry’, ‘like’, ‘follow’]

因素 tables 里面的参数是一个对象。

解决

直接赋予 var 新的对象,利用 JS 的对象操作进行动态赋值:

var sqlresult = {
"data": {
"csdn": ['cbry', 'like', 'follow'],
"blogChina": [],
"com": ['alibaba','uu','ireader']
}
};

 动态 JS 对象属性和值设置

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
	</head>
	<script type="text/javascript">
		var obj={};
		obj["name"] = "cbrj";

		//动态值赋予对象
		var url = "webUrl";
		var webUrl = "https://blog.csdn.net/qq_37334150";
		obj[url] = webUrl;
		console.log("JS对象名称: " + obj.name)
		console.log("编者的博客链接: " + obj.webUrl)
	</script>
	<body>
	</body>
</html>

利用这个也可以给 codeMirror 引入动态数据:tables[testStr] = testStrParams

js 对象动态设置效果

2021.04.22

应用 

var mime = 'text/x-flinksql';
    	var testStr = "Cbry_1";
    	var testStrParams = ['csdn','leetcode',''];

    	var test={};

    	test[testStr] = testStrParams
    	alert(JSON.stringify(test))

    	this.editor = CodeMirror.fromTextArea(document.getElementById('sqlEditor'), {
    	    mode: mime,
    	    indentWithTabs: true,
    	    smartIndent: true,
    	    styleActiveLine: true,
    	    lineNumbers: true,
    	    lineWrapping: true,
    	    matchBrackets: true,
    	    autofocus: true,
    	    extraKeys: {"Ctrl": "autocomplete"},
    	//  hintOptions的tables属性里面就是我们具体要提示的内容:key是表名称,value是字段
    	    hintOptions: {
    		completeSingle: false,
    	         tables:test
    	}
    	});

    	this.editor.on("keyup", function (cm, event) {
    	    //所有的字母和'$','{','.'在键按下之后都将触发自动完成
    	    if (!cm.state.completionActive &&
    	            ((event.keyCode >= 65 && event.keyCode <= 90 ) || event.keyCode == 52 || event.keyCode == 219 || event.keyCode == 190)) {
    	        CodeMirror.commands.autocomplete(cm, null, {completeSingle: false});
    	    }
    	});