5

我需要在控制器中获取(检索)更新的单元格值。(MVC)

所以我尝试了这个,

var modified = this.getItemGrid().getStore().getUpdatedRecords();
console.log(modified); // return [] empty array

var modified = this.getItemList_Store().getUpdatedRecords();
console.log(modified); // return [] empty array

但即使我更新了一些单元格值,它也总是返回空数组。

有人知道我做错了什么吗?

这是我的部分视图代码,

Ext.define("App.view.orders.ItemList_view", {
    extend: "Ext.grid.Panel",
    alias: "widget.itemList_view",
    plugins: [
            Ext.create('Ext.grid.plugin.CellEditing', {
                clicksToEdit: 1
            })
    ],
    initComponent: function () {
        this.store = "ItemList_store";
        this.columns = [
            {
                xtype: 'checkcolumn', text: "Ship", width: 50, dataIndex: "DR"
            },
            { header: "test", width: 100, dataIndex: "test",
                editor: {
                    xtype : 'textfield'
                }
            }
        ];

        this.selModel = Ext.create("Ext.selection.CheckboxModel");
        //this.selModel = Ext.create("Ext.selection.CellModel"); // It does not works either.

        this.callParent(arguments);
    },
    .
    .
    .

谢谢!

[编辑]

非常感谢您的回答!我还有一些关于编辑器网格的问题。

它与 Ext3 有很大不同。所以我现在很困惑:(

Q1。如何收集已编辑的记录数据(单击按钮)?

更改网格单元格后触发的事件。但是我想在单击“更新已编辑单元格”按钮后收集已编辑的网格记录,并且我想一次全部更新。

在 Ext3 中,我确实是这样的,

(button) click : function(){
    var modified = mygridStore.getModifiedRecords();

    var recordsToSend = [];
    Ext.each(modified, function(record){
        recordsToSend.push(record.data);
    });

    var grid = Ext.getCmp('grid');
    grid.el.mask('Updating','x-mask-loading');
    grid.stopEditing();

    recordsToSend = Ext.encode(recordsToSend);

    Ext.Ajax.request({
        url : '/test/test',
        params : {
            data : recordsToSend
        },
        success : function(response){
            grid.el.unmask();
            alert(response.responseText);
            mygridStore.commitChanges();
        },
        failure : function(response){
            mygridStore.rejectChanges();
        }
    });
}

如何更改 Extjs4 的代码?

Q2。我仍然不知道如何找出更改的校验列。

我试过了,但我不适用于 checkcolumn(因为我在更改复选框后进行了测试)

// grid coumn
{
 xtype: 'checkcolumn', header: "My Check Column", width: 50, dataIndex: "CH"
}

-

// in control
'myGrid': {
    validateedit: function (plugin, edit) {
        console.log(edit);
    },
    checkchange: function (plugin, edit) {
        console.log(edit);
        console.log(edit.value);
    }
}

Q3。当我单击要编辑的单元格时,会在 -_-; 中显示一些 HTML 标记;

在此处输入图像描述

我非常感谢您的帮助。非常感谢您宝贵的时间!

4

3 回答 3

10

编辑器(单元格编辑器或行编辑器)在您完成编辑之前不会将其值提交到存储区 - 这意味着ENTER通过单击页面上的其他位置或单击行编辑器表单上的保存按钮来按下或模糊活动的单元格编辑器。

如果您在编辑器中读取更新值的目的是执行某种验证,我建议validateedit您只需在网格控制器中收听事件,如此所述。

此事件传递给您的处理程序的第二个参数包含大量关于编辑的数据,您可以使用这些数据执行验证。如果编辑没有通过您的验证,您可以false从处理程序返回,并且 celleditor 中的值将恢复为原始值。该validateedit事件是从编辑器网格本身触发的,因此您可以在控制器中为它添加一个事件处理程序,如下所示:

Ext.define('MyApp.controller.MyController', {

    init: function() {

        this.control({

            'mygridpanel': {

                validateedit: function(plugin, edit) {

                    // silly validation function    
                    if (edit.value != 'A Valid Value') {
                        return false;
                    }
                },

            },

        });

    },

});

但是您应该查看上面的链接以查看我命名的第二个参数中可用的所有不同对象edit

validateedit事件在记录被提交到存储之前触发 - 在用户已经单击ENTER或模糊编辑器之后,即,当编辑器正在关闭时。

如果您试图在它开始关闭之前获取 celleditor 的值,例如出于验证以外的某些原因,您可以像这样获取活动的 celleditor 的值:

// myGrid is a reference to your Ext.grid.Panel instance
if (myGrid.editingPlugin.editing) {
    var value = myGrid.editingPlugin.getActiveEditor().field.value

    console.log('value: ' + value);
}

如果没有活动的编辑器,那么myGrid.editingPlugin.getActiveEditor().field会抛出一个错误,这就是为什么我在它周围加上一个条件。

我应该提出的另一点是,为了在编辑器网格中进行验证,我发现将validator配置放在网格列的editor定义中是最简单的。这将在用户设置字段值时为您提供所有方便的验证 CSS,并在他尝试保存之前提醒他该值是否存在问题。

要了解我的意思,请尝试在此示例的日期列中输入字母。将鼠标悬停在编辑器单元格上,您将收到错误消息。

编辑

看来我误解了你原来的问题,不过我会分解我对你上面问题的回答,

问题 1

完成编辑(单击ENTER或 )后,您的调用mygridStore.getModifiedRecords()应该可以正常工作,因为记录将已提交到存储。我看到它不起作用,我稍后会介绍。

我应该指出,ExtJS4 有一个store.sync()方法,如此所述。

无需从存储中提取修改后的记录、对其进行编码、手动执行 ajax 请求以将它们保存到服务器然后手动提交它们,您可以调用此sync方法,它会为您处理所有这些操作。

load如果您有不同的 URL 来处理由您的商店和方法触发的不同创建、读取、更新、销毁操作sync,您可以使用商店的代理api配置将您的 URL 映射到这些操作,如此所述。或者您可以设置您的服务器端控制器,以便能够区分您的商店load请求(读取操作默认为 HTTP GET)和同步请求(创建、更新和删除操作默认为 HTTP POST)。

在服务器端可以有许多不同的方法来执行此操作,我通常这样做的方法是为 GET 请求设置一个 SQL 存储过程,为任何给定商店设置一个用于 POST 请求的存储过程。我将商店名称作为额外参数包含在内,然后我的服务器端控制器根据它是 GET 还是 POST 请求运行适当的存储过程。

问题2

单元格编辑不支持checkcolumn编辑。你必须创建一个不同的处理程序来监听它的变化,像这样:

checkchange: function (column, rowIndex, checked) {
    var record = store.getAt(rowIndex),
        state = checked ? 'checked' : 'unchecked'

    console.log('The record:');
    console.log(record)
    console.log('Column: ' + column.dataIndex);
    console.log('was just ' + state)
}

您的调用也mygridStore.getModifiedRecords()应该能够获取检查更改,但是,它们在被检查后立即提交到网格的存储中。store.sync()还将获取对 checkcolumn 的更改。

问题 3

我无法完全说出导致该问题的原因,但您的事件可能发生了一些奇怪的事情validateedit,您的处理程序应该返回 true 或 false。

正如我之前所说,我误解了你最初问这个问题的原因。我以为您在进行编辑时正在尝试进行某种验证。现在我了解到,在完成所有编辑后,您正试图从存储中获取所有修改过的记录,以便将它们保存到数据库中,我被抛弃了,因为在 ExtJS 4 中,存储通常使用sync我提到的方法。

换句话说,您不需要validateedit事件或checkchange事件来获取修改记录的列表。

在某些 4.07 版本中,您遇到的实际问题可能是商店的 getter 方法(getModifiedRecords, getUpdatedRecords)出现问题,请查看这篇文章这篇文章。

综上所述,我能给你的最好建议是 1) 尝试将sync修改后的数据保存到数据库的 stores 方法和 2) 升级到 ExtJS 4.1,有很多错误在 4.07 和 4.1 之间得到了纠正你应该能够利用它,当我切换到 4.1 时,我删除了大约 75% 的覆盖来使事情正常工作。

于 2012-06-25T21:27:36.357 回答
1
EditedGrid.plugins[0].completeEdit();

这将使活动更改提交并调用编辑事件。

于 2014-06-05T07:57:00.130 回答
0
listeners: {
    validateedit: function (editor, e) {
        //console.log(editor);
    var oldVal = editor.originalValue;
    var newVal = editor.value;
    }
}
于 2013-03-24T11:46:19.957 回答