2017-08-04 13 views
0

私はエースエディタを使用しています。変数のみ(JSON)にreadyOnlyを適用したいと思います。 たとえば、この場合には、ユーザーは、変数「数」と「テキスト」を編集することはできませんが、彼は値を編集することができ、「10」と「私のテキスト」:エースエディタ - 準備完了の変数

{ 
    "number": 10, 
    "text": "my text" 
    } 

私はこのコードを使用してみました:

var Range = window.ace.require('ace/range').Range 
let range = new Range(1, 4, 4, 10); 
const markerId = session.addMarker(range, "readonly-highlight"); 
editor.keyBinding.addKeyboardHandler(              handleKeyboard : function(data, hash, keyString, keyCode, event) { 
if (hash === -1 || (keyCode <= 40 && keyCode >= 37)) return false; 
if (intersects(range)) { 
return {command:"null", passEvent:false}; 
    } 
    } 
}); 
before(editor, 'onPaste', preventReadonly); 
before(editor, 'onCut', preventReadonly); 
range.start = session.doc.createAnchor(range.start); 
range.end = session.doc.createAnchor(range.end); 
range.end.$insertRight = true; 
function before(obj, method, wrapper) { 
    var orig = obj[method]; 
    obj[method] = function() { 
    var args = Array.prototype.slice.call(arguments); 
    return wrapper.call(this, function(){ 
     return orig.apply(obj, args); 
    }, args); 
    } 
    return obj[method]; 
    } 
    function intersects(range) { 
    return editor.getSelectionRange().intersects(range); 
    } 
    function preventReadonly(next, args) { 
    if (intersects(range)) return; 
    next(); 
    } 

しかし、私はreadyOnlyに変数を選択できませんでした。 誰かが私を助けてくれますか?

答えて

0

isValidという機能を実装します。これは、キーnumbertextが常に存在することを確認するためです。

function isValid(code) { 
    if (Object.prototype.hasOwnProperty.call(code, 'number') && 
     Object.prototype.hasOwnProperty.call(code, 'text')) { 
     return true; 
    } 
    return false; 
} 

あなたはJSON.parse()codeを渡すことを確認し、JSONオブジェクト内のhasOwnPropertyチェックして以来エディタ

function updateCode(code) { 
    if (isValid(code)) { 
     // UPDATE THE CONTENT TO EDITOR 
    } else { 
     // AN ERROR MESSAGE MAYBE :) 
    } 
} 

onChange時にトリガされますupdateCodeと呼ばれる機能を実装し、実行を停止JSON解析が失敗した場合次の関数は、まだエースエディタ

handleOnChange(code) { 
    try { 
     var validCodeJson = JSON.parse(code); 
     // Valid Json. Validate keys and update 
     updateCode(validCodeJson); 
    } catch { 
     // Invalid Json. Some error message 
    } 
} 

onChange時にトリガされるべきで、それは完全なソリューションではありません。 Enterキーが押されたときなど、追加のバリデーションを追加する必要があるかもしれません。 (私はReactJSでAceエディタを使用しており、このようなエラーに遭遇しました)。

関連する問題