#javascript #jquery #json #gridstack
#javascript #jquery #json #gridstack
Вопрос:
У меня есть проект gridstack, над которым я работаю, и я могу вручную добавлять виджеты с другим контентом. Я могу расположить их так, как я хочу, а затем сохранить макет. Я могу в любое время загрузить макет обратно в последнюю точку сохранения. Вот пример этого:https://jsfiddle.net/m9rvcsu1 /
Моя проблема в том, что когда я загружаю макет, координаты и размер правильные, но содержимое виджетов неправильное. Все содержимое виджета возвращается к виджету по умолчанию.
Я считаю, что моя проблема вызвана этой строкой: myGrid.load(JSON.parse($('#tile-placement-string').val()), '#default-tile');
Итак, чтобы исправить это, я полагаю, мне нужно загрузить идентификатор каждого виджета в мою строку json, которую я использую для сохранения / загрузки позиций? Как я могу сделать это правильно?
Вот как выглядит мой json: [{«x»:0,»y»:0,»width»:2,»height»:2},{«x»:2,»y»:0,»width»:2,»height»:2},{«x»:4,»y»:0,»width»:2,»height»:2}]
Это моя функция сохранения и функция click, которая ее вызывает:
function save() {
return $.makeArray($(id ' > .grid-stack-item:visible')).map(function (v) {
var n = $(v).data('_gridstack_node');
return n ? { x: n.x, y: n.y, width: n.width, height: n.height } : null; //add in ability to store tile id for content loading
});
}
$('#save-grid').click(function () {
$('#tile-placement-string').val(JSON.stringify(myGrid.save())); //save tile coordinates as json
});
И вот как я загружаю данные:
function load(data, defaultTile) {
gridObj.removeAll();
$.each(data, function (k, v) { addTile(defaultTile, v.x, v.y, v.width, v.height); });
}
$('#load-grid').click(function () {
myGrid.load(JSON.parse($('#tile-placement-string').val()), '#default-tile'); //load tile coordinates from json string
});
Больше контекста можно найти в моей скрипке.
Чтобы воспроизвести проблему:
Нажмите Редактировать пользовательский интерфейс, затем щелкните диаграмму 1, затем щелкните диаграмму 2
Нажмите Редактировать пользовательский интерфейс, затем нажмите Сохранить
Нажмите Редактировать пользовательский интерфейс, затем нажмите Загрузить (обратите внимание, что все содержимое плиток было изменено на плитку по умолчанию)
Любая помощь приветствуется!
Комментарии:
1. Я добавлю, что если есть другой способ сделать это, я полностью за. Мне просто нужно иметь возможность загружать виджеты и сохранять в них соответствующие данные. Я не могу вернуть их все к виджету по умолчанию.
Ответ №1:
Прежде всего, давайте установим data-gs-id
атрибут в соответствии с документами в addTile
методе:
gridObj.addWidget(tile, x, y, w, h, null, null, null, null, null, defaultTile);
Затем давайте прочитаем и сохраним это в save
методе:
var gsId = $(v).data('gs-id');
return n ? { x: n.x, y: n.y, width: n.width, height: n.height, id: gsId } : null;
Наконец, давайте используем его для загрузки в load
метод:
$.each(data, function (k, v) { addTile(v.gsId || defaultTile, v.x, v.y, v.width, v.height); });
Комментарии:
1. Спасибо за ответ. По какой-то причине, когда я нажимаю «Загрузить», это просто очищает сетку. Это строка ответа json, которую я теперь получаю после сохранения: ` [{«x»:0,»y»:4,»width»:4,»height»:4,»id»:»#grid»},{«x»:0,»y»:2,»width»:2,»height»:2,»id»:»#grid»},{«x»:0,»y»:0,»width»:2,»height»:2,»id»:»#grid»}] `Итак, он извлекает идентификатор для реальной сетки, но мне нужно получить идентификатор для отдельных виджетов.
2. @burgoyne Вы, вероятно, скопировали что-то неправильно. Проверьте обновленную версию — у вас не должно возникнуть никаких проблем с разными именами в вашем коде.
3. Да, большое вам спасибо. Метод загрузки просто нужно изменить с
v.id
наv.gsId
. Еще раз спасибо!4. @burgoyne Да, обновил и эту часть. Пожалуйста, проверьте ответ как принятый, если он решает вашу проблему.
5. Просто интересно, так что мне вообще не нужно менять эту строку:
myGrid.load(JSON.parse($('#tile-placement-string').val()), '#default-tile');
? Я думал, что#default-tile
это была моя проблема. Я думаю, что нет!