Сохранить handsontable в постоянное состояние
Я создал таблицу с помощью handsontable:
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);
}
});
У них есть довольно сложный пример сохранения / загрузки на / с сервера с использованием ajax. Тем не менее, я просто хочу использовать постоянное состояние, чтобы сохранить загрузку всех вещей.
В частности, я хочу, чтобы при изменении значения ячейки в горячем состоянии я хотел сохранить эту информацию в каком-либо локальном хранилище, чтобы я мог получить ее позже. Самое близкое, что я получил, это использовать change
параметр в onChange и сохраните его вручную в localStorage. Мой главный вопрос - как я могу сохранить информацию о ячейке после ее изменения в каком-либо локальном хранилище? Лучше для постоянного хранения.
Кроме того, могу ли я сохранить весь hot
таблица для локального хранения? Что эффективнее обновлять всю таблицу каждый раз или обновлять только значение этой конкретной ячейки? Есть ли быстрый способ загрузки таблицы? Можете ли вы привести хороший пример, как я могу сохранить / загрузить таблицу в локальное хранилище при изменении?
2 ответа
В конце концов я пошел с чем-то вроде этого:
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
}
}
});
Есть много способов сделать то, что вы просите, поэтому вам придется попробовать и посмотреть. Наиболее распространенный способ сделать то, что вы просите, это получить данные onAfterChange
, В этом обратном вызове (прочитайте документацию) у вас есть доступ к новому значению, а также к строке и столбцу. На этом этапе вы можете сделать одну из двух вещей:
Вы можете хранить в localStorage
(row,col)
с данными в этой позиции. Это первый вариант. Затем onLoad вы можете просмотреть все доступные пары ключей, значений и установить массив данных.
Второе, что вы можете сделать, это гораздо проще, но дороже. в onAfterChange
Обратный вызов, каждый раз, сохранить содержимое hot.getData()
, Вы можете сделать это так:
// assuming 'hot' is the name of your handsontable instance
localStorage["data"] = hot.getData()
Хранение каждой ячейки выполняется быстро и занимает минимум места при сохранении (поэтому эта часть будет быстрой), но сложнее реализовать код загрузки. Сохранение всех данных может занять больше времени, но это значительно упрощает реализацию вашего кода (при загрузке просто установите data
возражать против значения localStorage.data
).
Сначала я бы попытался сохранить все данные (на самом большом наборе данных, который вы когда-либо имели) и посмотреть, будет ли он медленным. Если это так, используйте подход для каждой ячейки.
РЕДАКТИРОВАТЬ: постоянное состояние взято из документации
Ниже приводится прямая цитата. Отличие от того, что я написал ранее, состоит в том, что вместо того, чтобы делать localStorage["data"] = hot.getData()
вы бы вместо этого сделали hot.persistantStateSave("data", hot.getData())
Как сохранить данные локально.
Вы можете сохранить любые данные в локальном хранилище, чтобы сохранить состояние таблицы между перезагрузками страницы. Чтобы включить механизм хранения данных, 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
задано, все значения, связанные с таблицей, будут очищены.