设想
我有一个仪表板,其中一些小部件分组到用户可以单击的选项卡中。小部件具有默认的起始位置,包括高度和宽度,但如果用户移动或调整它们的大小(使用gridstack.js
),我会将新的小部件数据保存到本地存储。
如果用户在选项卡之间单击,则保持新的小部件位置。
问题
当用户刷新页面时,会加载默认的小部件位置,而不是本地存储中的数据。我尝试使用设置新位置,getWidgetData()
但没有运气。
我已经检查了我的grid-layout
数据的本地存储并且存在新位置。
代码示例
这是Codepen,因为我认为 SO 需要allow-same-origin
,因此破坏了代码段。
// Initialize zurb foundation
$(document).foundation();
$(function() {
var grid = $('.grid-stack').data('gridstack');
var options = {
cellHeight: 40,
verticalMargin: 28,
animate: false,
};
// Initialize grid-stack widgets
widgetsInit = function(options) {
$('.grid-stack').gridstack(options);
getWidgetData(); // Find and set positions from local storage
}
updateVisibleWidgetHeights = function(options) {
var targetPanel = '.tabs-panel.is-active';
$(targetPanel + ' .grid-stack .grid-stack-item').each(function(i){
$(targetPanel + ' .grid-stack').data('gridstack').resize(
$(targetPanel + ' .grid-stack .grid-stack-item')[i],
$($(targetPanel + ' .grid-stack .grid-stack-item')[i]).attr('data-gs-width'),
Math.ceil(($(targetPanel + ' .grid-stack .grid-stack-item .grid-stack-item-content')[i].scrollHeight + $(targetPanel + ' .grid-stack').data('gridstack').opts.verticalMargin) / ($(targetPanel + ' .grid-stack').data('gridstack').cellHeight() + $(targetPanel + ' .grid-stack').data('gridstack').opts.verticalMargin))
);
});
}
updateAllWidgetHeights = function(options) {
$('.grid-stack .grid-stack-item').each(function(i){
$('.grid-stack').data('gridstack').resize(
$('.grid-stack .grid-stack-item')[i],
$($('.grid-stack .grid-stack-item')[i]).attr('data-gs-width'),
Math.ceil(($('.grid-stack .grid-stack-item .grid-stack-item-content')[i].scrollHeight + $('.grid-stack').data('gridstack').opts.verticalMargin) / ($('.grid-stack').data('gridstack').cellHeight() + $('.grid-stack').data('gridstack').opts.verticalMargin))
);
});
}
getWidgetData = function() {
// // Load from local storage
var serialization = null;
if (serialization = localStorage.getItem("grid-layout")) {
_.each(JSON.parse(serialization), function (node) {
// Update each widget's properties from values in storage
$('.grid-stack-item[data-custom-id='+ node.id +']').attr({
'data-gs-x': node.x,
'data-gs-y': node.y,
'data-gs-width': node.width,
'data-gs-height': node.height,
});
});
} else {
console.log("There was no local storage data to read")
}
}
widgetsInit(options);
updateVisibleWidgetHeights();
$('.grid-stack').on('change', function (event, items) {
// Save data to local storage
var res = _.map($('.grid-stack .grid-stack-item'), function (el) {
el = $(el);
node = el.data('_gridstack_node');
return {
// Grab widget properties
id: el.attr('data-custom-id'),
x: node.x,
y: node.y,
width: node.width,
height: node.height
};
});
localStorage.setItem("grid-layout", JSON.stringify(res))
});
// On tab change update widget heights to the height of the content they contain
$(document).on('change.zf.tabs', function() {
updateVisibleWidgetHeights();
})
});
.grid-stack > .grid-stack-item > .grid-stack-item-content {
background-color: #fff;
cursor: move;
border: 1px solid #e3e3e3;
border-radius: 4px;
padding: 1rem;
}
<link href="https://cdnjs.cloudflare.com/ajax/libs/gridstack.js/0.4.0/gridstack.min.css" rel="stylesheet"/>
<link href="https://cdnjs.cloudflare.com/ajax/libs/foundation/6.4.3/css/foundation.min.css" rel="stylesheet"/>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.min.js"></script>
<script src='https://cdnjs.cloudflare.com/ajax/libs/gridstack.js/0.4.0/gridstack.min.js'></script>
<script src='https://cdnjs.cloudflare.com/ajax/libs/gridstack.js/0.4.0/gridstack.jQueryUI.min.js'></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/foundation/6.4.3/js/foundation.min.js"></script>
<ul class="tabs" data-tabs id="example-tabs" data-deep-link="true" data-update-history="true" data-match-height="false">
<li class="tabs-title is-active"><a href="#panel1" aria-selected="true">Tab 1</a></li>
<li class="tabs-title"><a href="#panel2">Tab 2</a></li>
</ul>
<div class="tabs-content unstyled" data-tabs-content="example-tabs">
<div class="tabs-panel is-active" id="panel1">
<div class="grid-stack">
<div class="grid-stack-item" data-gs-x="0" data-gs-y="0" data-gs-width="4" data-gs-height="2">
<div class="grid-stack-item-content">#1</div>
</div>
<div class="grid-stack-item" data-gs-x="4" data-gs-y="0" data-gs-width="4" data-gs-height="2">
<div class="grid-stack-item-content">#2</div>
</div>
<div class="grid-stack-item" data-gs-x="8" data-gs-y="0"data-gs-width="4" data-gs-height="2">
<div class="grid-stack-item-content">#3</div>
</div>
</div>
</div>
<div class="tabs-panel" id="panel2">
<div class="grid-stack">
<div class="grid-stack-item" data-gs-x="0" data-gs-y="0" data-gs-width="4" data-gs-height="2">
<div class="grid-stack-item-content">#4</div>
</div>
<div class="grid-stack-item" data-gs-x="4" data-gs-y="0" data-gs-width="4" data-gs-height="2">
<div class="grid-stack-item-content">#5</div>
</div>
<div class="grid-stack-item" data-gs-x="8" data-gs-y="0" data-gs-width="4" data-gs-height="2">
<div class="grid-stack-item-content">#6</div>
</div>
</div>
</div>
</div>