【问题标题】:Ace editor - save/send session on server via POSTAce 编辑器 - 通过 POST 在服务器上保存/发送会话
【发布时间】:2015-03-31 04:59:54
【问题描述】:

我编写在线网页编辑器,我想将当前视图/工作保存在服务器上,以便将来恢复。我也想做多个标签。

我知道,那就是editor.getSession()editor.setSession()

JS:

var editor = ace.edit("description");
editor.session.setMode("ace/mode/javascript");
editor.setTheme("ace/theme/tomorrow");
editor.setShowPrintMargin(false);
editor.setOptions({
    enableBasicAutocompletion: true,
    enableSnippets: true
});

现在我尝试通过 jQuery $.data() 将会话保存到元素:

$('#tab1').data('sesi',editor.getSession()); //save session
editor.setSession($('#tab2').data('sesi')); //restore other session

但是这段代码不起作用。当我尝试console.log(editor.session); 时,我在控制台中看到很多代码。

我尝试通过 POST 数据将session 发送到服务器,但在网络控制台中我只看到来自编辑器的代码,仅此而已...

$.ajax({
    type: "POST",
    url: "aaaaa.php",
    cache: false,
    timeout: 10000,
    data: "session="+ editor.session
});

如何将会话保存到变量或服务器?

【问题讨论】:

    标签: javascript php variables session ace-editor


    【解决方案1】:

    要将会话保存到服务器,您需要将其转换为可以传递给 json.Stringify 的普通对象。 session="+ editor.session 在您的示例中只是调用 session.toString ,这与 session.getValue 相同

    var filterHistory = function(deltas){ 
        return deltas.filter(function (d) {
            return d.group != "fold";
        });
    }
    
    sessionToJSON = function(session) {
        return {
            selection: session.selection.toJSON(),
            value: session.getValue(),
            history: {
                undo: session.$undoManager.$undoStack.map(filterHistory),
                redo: session.$undoManager.$redoStack.map(filterHistory)
            },
            scrollTop: session.getScrollTop(),
            scrollLeft: session.getScrollLeft(),
            options: session.getOptions()
        }
    }
    
    sessionFromJSON = function(data) {
        var session = require("ace/ace").createEditSession(data.value);
        session.$undoManager.$doc = session; // workaround for a bug in ace
        session.setOptions(data.options);
        session.$undoManager.$undoStack = data.history.undo;
        session.$undoManager.$redoStack = data.history.redo;
        session.selection.fromJSON(data.selection);
        session.setScrollTop(data.scrollTop);
        session.setScrollLeft(data.scrollLeft);
        return session;
    };
    

    现在获取会话状态

    var session = editor.session
    var sessionData = sessionToJSON(session)
    $.ajax({
        type: "POST",
        url: "aaaaa.php",
        cache: false,
        timeout: 10000,
        data: JSON.stringify(sessionData)
    });
    

    并从服务器恢复它

    var session = sessionFromJSON(JSON.parse(ajaxResponse))
    editor.setSession(session)
    

    【讨论】:

    • 是2个小bug:data = sessionToJSON(session)改成data = sessionToJSON(editor.session)data: JSON.stringify(editor.session)改成data: JSON.stringify(data)
    • @a 用户,您不能只使用session,因为这是未定义的变量。 editor.session 是正确的。
    • 抱歉有错别字。该代码假定您可以通过某种方式从editor.session 或其他传递会话的函数中获取session
    • 如果您使用的是无冲突版本,则全局 aceace.require("ace/ace") 相同
    • 这是 ace 中的一个错误,我已经用解决方法更新了我的答案
    猜你喜欢
    • 2013-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-01
    相关资源
    最近更新 更多