【问题标题】:SlickGrid - Handling DataView with grid.onAddNewRowSlickGrid - 使用 grid.onAddNewRow 处理 DataView
【发布时间】:2015-09-28 23:44:48
【问题描述】:

我正在使用 SlickGrid 生成数据网格。数据由 jQuery AJAX 调用获取。在https://stackoverflow.com/a/11611477/2294855 的建议下,我能够处理响应数据并将其设置为 DataView。但是当我将 Grid 选项设置为“enableAddRow: true”时,我的问题就出现了。

在这里,当我尝试在新行中添加内容时,每当我在任何单元格中插入内容并转移到其他单元格时,数据都不存在。例如:

我对网格的声明:

var categories, categoryList, subjectList, data, grid;
var url = "{{ url('get_data', {'_prefix': app.request.get('_prefix')}) }}";

var dataView = new Slick.Data.DataView();

var columns = [
    {id: "serial", name: "Ordnungsnummer", field: "serial", editor: Slick.Editors.Integer, validator: requiredFieldValidator, sortable: true},
    {id: "category", name: "Kategorie", field: "category", editor: Slick.Editors.categoryDropdown, formatter: Slick.Formatters.category, validator: requiredFieldValidator, sortable: true},
    {id: "subject", name: "Themenbereich", field: "subject", editor: Slick.Editors.subjectDropdown, formatter: Slick.Formatters.subject, validator: requiredFieldValidator, sortable: true},
    {id: "week", name: "Schulwoche", field: "week", editor: Slick.Editors.Integer, validator: requiredFieldValidator, sortable: true},
    {id: "note", name: "Anmerkung", field: "note", editor: Slick.Editors.LongText, validator: requiredFieldValidator}
];

var options = {
    editable: true,
    enableAddRow: true,
    enableCellNavigation: true,
    asyncEditorLoading: true,
    forceFitColumns: true,
    topPanelHeight: 25
};

grid = new Slick.Grid("#myGrid", dataView, columns, options);

// wire up model events to drive the grid
dataView.onRowCountChanged.subscribe(function (e, args) {
    grid.updateRowCount();
    grid.render();
});

dataView.onRowsChanged.subscribe(function (e, args) {
    grid.invalidateRows(args.rows);
    grid.render();
});

grid.onAddNewRow.subscribe(function (e, args) {
    var item = args.item;
    var column = args.column;
    grid.invalidateRow(dataView.length);
    dataView.push(item);
    grid.updateRowCount();
    grid.render();
});

function fetchData() {

    $.ajax({
        type: "POST",
        url: url,
        dataType: "json",
        data: {schoolclass: {{ schoolclass }}},
        success: function( response ) {
            createGrid(response);
        }
    });
}

function requiredFieldValidator(value) {
    if (value == null || value == undefined || !value.length) {
        return {valid: false, msg: "This is a required field"};
    }
    else {
        return {valid: true, msg: null};
    }
}

function createGrid(response) {

    data = response.data;

    categories = response.categories;
    categoryList = generateCategoryList(categories);
    subjectList = generateSubjectList(categories);



    dataView.beginUpdate();
    dataView.setItems(data);
    console.log(data);
    dataView.endUpdate();
}

function generateCategoryList(categories) {
    var categoryList = {};

    $.each(categories, function(index, item) {
        categoryList[item.id] = item.name;
    });

    return categoryList;
}

function generateSubjectList(categories) {
    var subjectList = {};

    $.each(categories, function(index, category) {
        $.each(category.subjects, function(index, subjects) {
            subjectList[subjects.id] = subjects.name;
        });
    });

    return subjectList;
}

function sendData(data) {
    $.ajax({
        type: "POST",
        url: url,
        dataType: "json",
        data: data,
        success: function( response ) {
            createGrid(response);
            alert("data successfully saved");
        },
        error: function(textStatus, errorThrown) {
            alert("sorry could not save the data");
            console.log("text Status = "+ textStatus);
            console.log("Error Thrown = "+ errorThrown);
        }
    });
}

$(function () {

    fetchData();

    $("#save").click(function() {

        var newData = JSON.stringify(grid.getData());

        sendData(newData);
    });
})

非常感谢任何帮助。

【问题讨论】:

    标签: jquery ajax symfony twig slickgrid


    【解决方案1】:

    为了解决手头的问题,您的数据不存在的原因是onAddNewRow 处理程序中的dataView.push(item);。 使用数据视图的addItem 函数。

    我假设您的数据在每个项目上都有一个 id 属性,否则数据将不会显示。因此,您还需要通过将新数据元素添加到处理程序中的var item = args.item; 来解决需要唯一id 的问题。

    如果您的数据元素有一个现有字段,以 serial 为例,它在所有元素中都是唯一的,那么您可以配置您的数据视图以将该字段用作所需的 id,方法是将其传递给 setItems 函数.那时,您不必手动分配id

    此外,由于grid.getData(),您在保存数据时会遇到问题。要从数据视图中获取数据,请使用grid.getData().getItems()

    【讨论】:

      猜你喜欢
      • 2012-03-31
      • 2023-03-28
      • 1970-01-01
      • 2013-11-01
      • 2018-12-13
      • 1970-01-01
      • 2011-11-26
      • 1970-01-01
      • 2012-02-26
      相关资源
      最近更新 更多