Я пытаюсь обновить свою сетку без необходимости обновления! Прямо сейчас он обновляет только сетку, но не знаю почему, он меняет идентификатор на последний вставленный и не «очищает» пустую строку! Когда я пытаюсь вставить данные, он очищает их. Я новичок в ajax и slickgrid! Я пытался увидеть пример ajax от slickgrid, но получил несколько ошибок! Нужно ли повторно загружать onCellChange и т. д.? Я просто хотел обновить сетку новыми данными. Любая помощь?
заранее спасибо
Итак, я попытался перерисовать таблицу, повторно используя мой фактический код рисования, но мне не удалось перерисовать с правильными данными.
Функция перерисовки сетки
function desenhaGrid() {
$("#myGrid").ready(function () {
$(function () {
$.ajax({
type: "GET",
url: '/SlickGrid/GetData',
dataType: 'json',
success: function (jsonResult) {
for (var key in jsonResult) {
if (jsonResult.hasOwnProperty(key)) {
//print table
var d = (data[key] = {});
for (var i = 0; i < data.length; i++) {
d["#"] = i + 1;
}
d["id"] = jsonResult[key].id;
d["t_nome"] = jsonResult[key].t_nome;
d["t_prof"] = jsonResult[key].t_prof;
d["t_data"] = jsonResult[key].t_data;
d["t_morada"] = jsonResult[key].t_morada;
d["t_percCompleto"] = jsonResult[key].t_percCompleto;
}
}
grid = new Slick.Grid("#myGrid", dataView, columns, options);
dataView.beginUpdate();
grid.invalidateAllRows();
dataView.setItems(data);
grid.render();
dataView.endUpdate();
}
});
});
});
}
и это мой onAddNewRow
grid.onAddNewRow.subscribe(function (e, args) {
var idData = jsonResult[key].id + 1;
var item = { "id": idData, "t_nome": '', "t_prof": '', "t_data": '', "t_morada": '', "t_percCompleto": '' };
$.extend(item, args.item);
dataView.addItem(item);
//if user press enter
grid.onKeyDown.subscribe(function (e) {
var keyPressed = event.keyCode || event.which;
if (keyPressed == 13) {
alert("add");
var myJSON = JSON.stringify(item);
$.post("/SlickGrid/addGridEnter", $("input[name=mydata]").val(myJSON));
console.info(myJSON);
desenhaGrid();
}
});
});
Я ожидал, что он перерисует мою сетку со всеми данными. Вместо этого он меняет все идентификаторы на последний вставленный, и когда я пытаюсь вставить данные в последнюю строку, он не позволяет мне (он очищает его после того, как я покидаю ячейку).
ОБНОВИТЬ:
Я обновил функцию рисования сетки
function desenhaGrid() {
$("#myGrid").load(function () {
$(function () {
$.ajax({
type: "GET",
url: '/SlickGrid/GetData',
dataType: 'json',
success: function (jsonResult) {
dataView.beginUpdate();
grid.invalidateAllRows();
dataView.setItems(jsonResult);
dataView.endUpdate();
grid.render();
}
});
});
});
}
Я не думаю, что это проблема SlickGrid. С javascript бывают всякие проблемы. Например:
почему ты используешь $("#myGrid").ready(
? событие ready
срабатывает только после завершения загрузки DOM
вся операция копирования из jsonResult
в data
заканчивается теми же данными. почему бы не использовать jsonResult
напрямую?
раздел for (var i = 0; i < data.length; i++) { d["#"] = i + 1; }
запускается один раз для каждой строки, добавленной в data
, он должен запускаться только один раз в конце, вне цикла
вы подписываетесь на событие keydown один раз для каждой строки, добавленной в сетку. Вы должны просто подписаться один раз. прослушивание клавиши Enter также является очень плохим методом определения того, введена ли строка. что, если кто-то щелкнет другую строку, прежде чем нажать Enter?
Slickgrid — это клиентская сетка. Это означает, что данные не нужно сохранять после каждого изменения. Распространенным подходом является использование кнопки «Сохранить» или определение того, изменилась ли активная строка.
Бен, когда вы говорите «вы должны просто подписаться один раз», не могли бы вы уточнить?! Должен ли я сначала обнаружить ввод, а затем изменить применение onAddNewRow? Позже я попытаюсь обновить IRL (например, когда oncellchange включен, применить изменение напрямую к БД - примерно как в Excel).
Ajax имеет тенденцию быть довольно сложным. Например, вам нужна стратегия для проверки. Как узнать, содержит ли строка допустимые данные и действительно ли она может быть сохранена в хранилище данных? Часто используется кнопка «изменить строку», а затем «сохранить строку» и «отменить редактирование». Если проверки нет, лучше всего просто сохранить значение ячейки с помощью AJAX с помощью настраиваемого редактора ячеек. Не должно быть необходимости перерисовывать сетку, если только данные не были изменены удаленным источником.
Обратите внимание, что проблема с вашей функцией desenhaGrid заключается в том, что она фактически не повторно заполняет данные сетки, а просто настраивает это на событие готовности DOM. Что уже произошло при загрузке страницы, поэтому, скорее всего, больше никогда не сработает. Кроме того, вы снова добавляете событие, поэтому, если событие готовности когда-либо произойдет, оно будет срабатывать столько раз, сколько вы его вызвали.
Привет, Бен! Спасибо за ответ! Да, Ajax немного сложен, но у меня все получилось! Я пытался перерисовать сетку после того, как пользователь вставил новую строку! Он делает это прямо сейчас! :) Как вы сказали: «Что уже произошло при загрузке страницы, поэтому, скорее всего, больше никогда не сработает»! это никогда не запускало событие! Прямо сейчас делает это! Еще раз спасибо! Кстати, если вы не возражаете: вы не знаете, возможно ли одновременно использовать и модель выбора ячеек, и модель выбора строки? Для того, что я тестирую, одно перекрывает другое!
невозможно использовать оба. вам нужно будет создать пользовательскую модель выбора для ваших целей.
Привет Бен! Итак, для ответов на ваши вопросы: 1) Как указано выше, я новичок в Ajax! Я просто видел несколько примеров и надеялся на лучшее! Я изменился, чтобы щелкнуть или загрузить, но все еще не понял, как с этим работать. 2) Теперь я просто оборачиваю json в сетку, поэтому код стал немного чище (после этого я отредактирую). 3) Да, я тоже это заметил! этот цикл используется только для добавления числа в строку (более наглядная вещь) 4) Это только сейчас! Я тестирую и разбираю slickgrid как могу! Я думал о onCellChange (когда пользователь покидает ячейку, она сохраняется в БД)