Ace editor - сохранить / отправить сеанс на сервере через POST
Я пишу онлайн редактор веб-страниц, и я хотел бы сохранить текущий вид / работу на сервере для восстановления в будущем. Я также хочу сделать несколько вкладок.
Я знаю, это 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);
Я вижу много кода в консоли.
Я пытался отправить session
к серверу через данные POST, но в сетевой консоли я вижу только код из редактора и ничего более...
$.ajax({
type: "POST",
url: "aaaaa.php",
cache: false,
timeout: 10000,
data: "session="+ editor.session
});
Как сохранить сессию в переменную или на сервер?
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)