将 handsontable 保存到持久状态
save handsontable to persistent state
我使用 handsontable 创建了一个 table:
hot = new Handsontable(container, {
data: [],
dataSchema: {id: null},
startRows: 5,
startCols: 1,
colHeaders: ["Car"],
columns: [
{data: 'id'}
],
rowHeaders: true,
minSpareRows: 1,
persistentState: true,
onChange: function (change, source) {
console.log(change);
console.log(source);
}
});
他们在 saving/loading to/from 服务器上使用 ajax 精心设计了 example。但是,我只想使用持久状态来保存加载所有内容。
特别是当单元格的热值发生变化时,我想将此信息保存在某个本地存储中,以便以后检索。我最接近的是在 onChange 中使用 change
参数并将其手动保存到 localStorage。我的主要问题是一旦更改为某个本地存储,我如何保存单元格的信息?最好是 persistentStorage。
另外,我可以将整个 hot
table 保存到本地存储吗?每次更新整个 table 或仅更新该特定单元格的值哪个更有效?有没有快速加载table的方法?您能否提供一个很好的示例,我如何 save/load table 到本地存储 on change?
有很多方法可以满足您的要求,所以您必须尝试一下看看。执行您要求的最常见方法是获取数据 onAfterChange
。在此回调(阅读文档)中,您可以访问新值以及行和列索引。届时,您可以执行以下两项操作之一:
您可以将 localStorage
中的数据存储在 (row,col)
中。这是第一个选项。然后 onLoad 您可以遍历所有可用的键值对并设置数据数组。
您可以做的第二件事要容易得多,但成本更高。在onAfterChange
回调中,每次保存hot.getData()
的内容。你可以这样做:
// assuming 'hot' is the name of your handsontable instance
localStorage["data"] = hot.getData()
存储每个单元格的速度很快,并且在保存时花费的时间最少 space(因此这部分会很快),但实现加载代码比较困难。存储所有数据可能需要更长的时间,但它使您的代码更容易实现(加载时,只需将 data
对象设置为 localStorage.data
的值)。
我会先尝试存储所有数据(在您认为您将拥有的最大数据集上),然后看看它是否很慢。如果是,请使用每个单元格的方法。
编辑:持久状态取自documentation
以下是直接引用。这里与我之前发布的内容的不同之处在于,您不会执行 localStorage["data"] = hot.getData()
,而是执行 hot.persistantStateSave("data", hot.getData())
如何在本地保存数据。
您可以将任何类型的数据保存在本地存储中,以在页面重新加载之间保持 table 状态。为了启用数据存储机制,必须将 persistantState
选项设置为 true
(您可以在 Handsontable 初始化期间或使用 updateSettings
方法设置它)。启用 persistentState
后,它会公开 3 个挂钩:
persistentStateSave
(key: String
, value: Mixed
) 在浏览器本地存储中保存给定键下的值。
persistentStateLoad
(key: String
, valuePlaceholder: Object
)
加载 value
,保存在给定 key
下,形成浏览器本地存储。加载的 value
将保存在 valuePlaceholder.value
中(这是由于 PluginHooks.execute()
方法的特定行为)。如果 key
下没有保存任何值,valuePlaceholder.value
将是 undefined
.
persistentStateReset
(key: String
)
清除 key
下保存的值。如果没有给出 key
,所有与 table 关联的值都将被清除。
最终,我做了这样的事情:
hot = new Handsontable(container, {
data: [],
dataSchema: {id: null},
startCols: 4,
colHeaders: ["ID"],
columns: [
{data: 'id'}
],
rowHeaders: true,
minSpareRows: 4,
afterChange: function (change, source) {
// restore table after reload of a page
if (source === "loadData") {
// load data from local storage
if (localStorage['data']) {
var data = JSON.parse(localStorage['data'])
this.loadData(data);
this.render();
return
}
}
else {
// save all data to local storge if the edit happends
localStorage['data'] = JSON.stringify(this.getData());
return
}
}
});
我使用 handsontable 创建了一个 table:
hot = new Handsontable(container, {
data: [],
dataSchema: {id: null},
startRows: 5,
startCols: 1,
colHeaders: ["Car"],
columns: [
{data: 'id'}
],
rowHeaders: true,
minSpareRows: 1,
persistentState: true,
onChange: function (change, source) {
console.log(change);
console.log(source);
}
});
他们在 saving/loading to/from 服务器上使用 ajax 精心设计了 example。但是,我只想使用持久状态来保存加载所有内容。
特别是当单元格的热值发生变化时,我想将此信息保存在某个本地存储中,以便以后检索。我最接近的是在 onChange 中使用 change
参数并将其手动保存到 localStorage。我的主要问题是一旦更改为某个本地存储,我如何保存单元格的信息?最好是 persistentStorage。
另外,我可以将整个 hot
table 保存到本地存储吗?每次更新整个 table 或仅更新该特定单元格的值哪个更有效?有没有快速加载table的方法?您能否提供一个很好的示例,我如何 save/load table 到本地存储 on change?
有很多方法可以满足您的要求,所以您必须尝试一下看看。执行您要求的最常见方法是获取数据 onAfterChange
。在此回调(阅读文档)中,您可以访问新值以及行和列索引。届时,您可以执行以下两项操作之一:
您可以将 localStorage
中的数据存储在 (row,col)
中。这是第一个选项。然后 onLoad 您可以遍历所有可用的键值对并设置数据数组。
您可以做的第二件事要容易得多,但成本更高。在onAfterChange
回调中,每次保存hot.getData()
的内容。你可以这样做:
// assuming 'hot' is the name of your handsontable instance
localStorage["data"] = hot.getData()
存储每个单元格的速度很快,并且在保存时花费的时间最少 space(因此这部分会很快),但实现加载代码比较困难。存储所有数据可能需要更长的时间,但它使您的代码更容易实现(加载时,只需将 data
对象设置为 localStorage.data
的值)。
我会先尝试存储所有数据(在您认为您将拥有的最大数据集上),然后看看它是否很慢。如果是,请使用每个单元格的方法。
编辑:持久状态取自documentation
以下是直接引用。这里与我之前发布的内容的不同之处在于,您不会执行 localStorage["data"] = hot.getData()
,而是执行 hot.persistantStateSave("data", hot.getData())
如何在本地保存数据。
您可以将任何类型的数据保存在本地存储中,以在页面重新加载之间保持 table 状态。为了启用数据存储机制,必须将 persistantState
选项设置为 true
(您可以在 Handsontable 初始化期间或使用 updateSettings
方法设置它)。启用 persistentState
后,它会公开 3 个挂钩:
persistentStateSave
(key: String
, value: Mixed
) 在浏览器本地存储中保存给定键下的值。
persistentStateLoad
(key: String
, valuePlaceholder: Object
)
加载 value
,保存在给定 key
下,形成浏览器本地存储。加载的 value
将保存在 valuePlaceholder.value
中(这是由于 PluginHooks.execute()
方法的特定行为)。如果 key
下没有保存任何值,valuePlaceholder.value
将是 undefined
.
persistentStateReset
(key: String
)
清除 key
下保存的值。如果没有给出 key
,所有与 table 关联的值都将被清除。
最终,我做了这样的事情:
hot = new Handsontable(container, {
data: [],
dataSchema: {id: null},
startCols: 4,
colHeaders: ["ID"],
columns: [
{data: 'id'}
],
rowHeaders: true,
minSpareRows: 4,
afterChange: function (change, source) {
// restore table after reload of a page
if (source === "loadData") {
// load data from local storage
if (localStorage['data']) {
var data = JSON.parse(localStorage['data'])
this.loadData(data);
this.render();
return
}
}
else {
// save all data to local storge if the edit happends
localStorage['data'] = JSON.stringify(this.getData());
return
}
}
});