At.js 和 CodeMirror 的组合
Combination of At.js and CodeMirror
我正在尝试将 CodeMirror 和 At.js 合并为一个 "editor"。我在当前版本的编辑器中使用 At.js 来插入代表 DSL 某些方面的 HTML 的位。
所以at.js基本上处理了编辑器的自动完成部分。这一切都很好。然而,编辑器需要一些微调(行号、更好地处理输入等)。
CodeMirror 提供了这个。然而,它不能很好地与 At.js 配合使用。出于某种原因(我还找不到)At.js 没有注册事件或绑定到我已将 CodeMirror 绑定到的 domElement。
我试图通过捕获 CM 事件并修复事件并在所述 domElement 上触发这些事件来手动使 CodeMirror 事件在 DOM 中冒泡。到目前为止运气不好。
cm.on("keyup", function ( editor, e ) {
e = $.event.fix(e);
e.namespace = 'atwhoInner';
console.warn("cmUp", e);
$(self.domElement).trigger($.event.fix(e));
});
cm.on("keydown", function ( editor, e ) {
e = $.event.fix(e);
e.namespace = 'atwhoInner';
console.warn("cmDown", e);
$(self.domElement).trigger($.event.fix(e));
});
我可以捕捉到事件,所以我知道它工作正常。
我会看看是否可以创建一个 fiddle 来准确模拟我的情况(我将在这之后做)。同时,如果有人能指出我的大致方向,那就太好了。
我自己的猜测是 CM 阻止事件冒泡或阻止 At.js 附加它需要的一些 HTML 元素。或者我需要将 A.js 绑定到不同的元素。
快速概览一下我得到的内容(一点也不完整)。
var domElement = $('#someid');
//Using domElement directly causes CodeMirror to flipout.
var cm = CodeMirror(domElement[0], {
mode: "htmlmixed",
extraKeys: { "Ctrl-Space": "autocomplete" },
value: ' <span></span>',
lineNumbers: true
});
cm.on("keyup", function ( editor, e ) {
e = $.event.fix(e);
e.namespace = 'atwhoInner';
console.warn("cmUp", e);
$(self.domElement).trigger($.event.fix(e));
});
cm.on("keydown", function ( editor, e ) {
e = $.event.fix(e);
e.namespace = 'atwhoInner';
console.warn("cmDown", e);
$(self.domElement).trigger($.event.fix(e));
});
domElement.atwho({
at: 'fancystuff.',
displayTpl: "${displayTpl}",
insertTpl: "${insertTpl}",
showTheAt: false,
limit: 100,
searchKey: "searchField",
suffix: "",
data: [{displayTpl:'some templating', insertTpl: 'some templating', searchField;'stuff to search'},
{displayTpl:'some templating', insertTpl: 'some templating', searchField;'stuff to search'}
]
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id='someid' contenteditable='true'></div>
原来是个愚蠢的问题。 CodeMirror 将自己包裹在 <textarea>
周围,并且对它实际放置的 div 不做任何事情。
这段代码解决了我的问题(有点):
$('.CodeMirror',self.templateDomElement).find('textarea').atwho({stuff: "goeshere"});
我现在可以得到 atWho to bind,但是它将 html 作为明文插入。这就是您希望 CodeMirror 执行的操作。但是我需要插入实际的 HTML,而不是 HTML 作为纯文本。所以我会研究如何解决这个问题。
等我解决了这个问题再回来。
编辑:事实证明这几乎是不可能解决的。 At.js 使用 dom 做了一些时髦的事情来放置一个包含所有可能选项的容器。我最终使用 CodeMirror 的默认功能编写了自己的提示函数。
我正在尝试将 CodeMirror 和 At.js 合并为一个 "editor"。我在当前版本的编辑器中使用 At.js 来插入代表 DSL 某些方面的 HTML 的位。
所以at.js基本上处理了编辑器的自动完成部分。这一切都很好。然而,编辑器需要一些微调(行号、更好地处理输入等)。
CodeMirror 提供了这个。然而,它不能很好地与 At.js 配合使用。出于某种原因(我还找不到)At.js 没有注册事件或绑定到我已将 CodeMirror 绑定到的 domElement。
我试图通过捕获 CM 事件并修复事件并在所述 domElement 上触发这些事件来手动使 CodeMirror 事件在 DOM 中冒泡。到目前为止运气不好。
cm.on("keyup", function ( editor, e ) {
e = $.event.fix(e);
e.namespace = 'atwhoInner';
console.warn("cmUp", e);
$(self.domElement).trigger($.event.fix(e));
});
cm.on("keydown", function ( editor, e ) {
e = $.event.fix(e);
e.namespace = 'atwhoInner';
console.warn("cmDown", e);
$(self.domElement).trigger($.event.fix(e));
});
我可以捕捉到事件,所以我知道它工作正常。
我会看看是否可以创建一个 fiddle 来准确模拟我的情况(我将在这之后做)。同时,如果有人能指出我的大致方向,那就太好了。
我自己的猜测是 CM 阻止事件冒泡或阻止 At.js 附加它需要的一些 HTML 元素。或者我需要将 A.js 绑定到不同的元素。
快速概览一下我得到的内容(一点也不完整)。
var domElement = $('#someid');
//Using domElement directly causes CodeMirror to flipout.
var cm = CodeMirror(domElement[0], {
mode: "htmlmixed",
extraKeys: { "Ctrl-Space": "autocomplete" },
value: ' <span></span>',
lineNumbers: true
});
cm.on("keyup", function ( editor, e ) {
e = $.event.fix(e);
e.namespace = 'atwhoInner';
console.warn("cmUp", e);
$(self.domElement).trigger($.event.fix(e));
});
cm.on("keydown", function ( editor, e ) {
e = $.event.fix(e);
e.namespace = 'atwhoInner';
console.warn("cmDown", e);
$(self.domElement).trigger($.event.fix(e));
});
domElement.atwho({
at: 'fancystuff.',
displayTpl: "${displayTpl}",
insertTpl: "${insertTpl}",
showTheAt: false,
limit: 100,
searchKey: "searchField",
suffix: "",
data: [{displayTpl:'some templating', insertTpl: 'some templating', searchField;'stuff to search'},
{displayTpl:'some templating', insertTpl: 'some templating', searchField;'stuff to search'}
]
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id='someid' contenteditable='true'></div>
原来是个愚蠢的问题。 CodeMirror 将自己包裹在 <textarea>
周围,并且对它实际放置的 div 不做任何事情。
这段代码解决了我的问题(有点):
$('.CodeMirror',self.templateDomElement).find('textarea').atwho({stuff: "goeshere"});
我现在可以得到 atWho to bind,但是它将 html 作为明文插入。这就是您希望 CodeMirror 执行的操作。但是我需要插入实际的 HTML,而不是 HTML 作为纯文本。所以我会研究如何解决这个问题。
等我解决了这个问题再回来。
编辑:事实证明这几乎是不可能解决的。 At.js 使用 dom 做了一些时髦的事情来放置一个包含所有可能选项的容器。我最终使用 CodeMirror 的默认功能编写了自己的提示函数。