2016-06-01 5 views
1

私はCodeMirrorとAt.jsを1つの "エディタ"に結合しようとしています。私は現在のバージョンのエディタでAt.jsを使用して、DSLの特定の側面を表すHTMLのビットを挿入しています。At.jsとCodeMirrorの組み合わせ

したがって、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)); 
 
    });

私はそれが正常に働いている知っているので、私はイベントをキャッチすることができます。

自分の状況を正確に模倣するためのフィドルを作成できるかどうかを確認します(これは後で行います)。その間に誰かが私を一般的な方向に向けることができればそれは素晴らしいことです。

私自身の推測では、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>

答えて

2

。 。CodeMirrorは<textarea>の周りに自分自身をラップし、それが実際に置かれているのdivで何もしません

コードのこのビットは(ちょっと)私の問題を解決する:$(「CodeMirror。」、self.templateDomElement).find( 『テキストエリア』を).atwho({stuff: "goeshere"});

今すぐバインドすることができますが、htmlをプレーンテキストとして挿入します。 CodeMirrorが何を期待しているのですか?しかし、私はプレーンテキストとしてHTMLではなく実際のHTMLを挿入する必要があります。だから私はこれにアプローチする方法を検討するでしょう。

私が解決したらこの質問に戻ります。

編集:解決することは不可能であったことが分かります。 At.jsは、可能なすべてのオプションを持つコンテナを配置するためのdomでいくつかのファンキーなものを実行します。 CodeMirrorのデフォルト機能を使用して、独自のヒント関数を作成しました。

関連する問題