jquery - SlickGrid - 使用 grid.onAddNewRow 处理 DataView

标签 jquery ajax symfony twig slickgrid

我正在使用 SlickGrid 生成数据网格。数据通过 jQuery AJAX 调用获取。根据https://stackoverflow.com/a/11611477/2294855的建议我能够处理响应数据并将其设置到 DataView。但是当我将网格选项设置为“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);
    });
})

非常感谢任何帮助。

最佳答案

为了解决当前的问题,数据不存在的原因是 onAddNewRow 处理程序中的 dataView.push(item);。 使用addItem数据 View 的功能。

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

如果您的数据元素有一个现有字段,以 serial 为例,该字段在所有元素中都是唯一的,那么您可以将数据 View 配置为使用该字段作为所需的 id,方法是将其传递到setItems功能。届时,您无需手动分配 id

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

关于jquery - SlickGrid - 使用 grid.onAddNewRow 处理 DataView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31337153/

相关文章:

html - Symfony 和 RequireJS - 如何提供静态 html 文件?

javascript - 为什么我不断收到 "displaymessage is not defined"错误消息?

javascript - 更改元素的 HTML 后,CSS 悬停状态保留在 Safari 中

javascript - Post 方法从 ajax 调用 ASP.net 4.5 接收到 null 值

javascript - 响应后在表格单元格上添加双击处理程序

php - Symfony2 - Doctrine - 2 个 bundle 之间的实体关系

javascript - 如何在悬停时制作圆 Angular ?

javascript - 如何在Java脚本中基于范围绘制多色折线图?

javascript - 使用php接收post数据ajax

mysql - 带有可选参数的 Dql 查询