Select ExtJS-如何将选择回滚到网格中的旧选定记录?

Select ExtJS-如何将选择回滚到网格中的旧选定记录?,select,extjs,grid,selection,rollback,Select,Extjs,Grid,Selection,Rollback,它使用ExtJS的网格。 我想在网格中的记录更改为另一个记录之前进行一些验证 下面是我的示例代码: xtype: 'grid', bind: { store:'{xxStore}' }, columns: [ { text: 'Name', dataIndex: 'name', } ], listeners:{ beforeselect: 'onBeforeSelect', select: 'onSelect' } 在控制

它使用ExtJS的网格。 我想在网格中的记录更改为另一个记录之前进行一些验证

下面是我的示例代码:

xtype: 'grid',
bind: {
    store:'{xxStore}'
},
columns: [
    {
        text: 'Name',
        dataIndex: 'name',
    }
],
listeners:{
    beforeselect: 'onBeforeSelect',
    select: 'onSelect'
}
在控制器中,示例代码如下所示:

onBeforeSelect: function(grid) {
    // whether can select or not
    if (this.getSettingType() === 'global') {
        return false;
    }
},

onSelect: async function(grid, itemRecord) {
    if (!(await checkUserAction())) {
        // TODO: how to rollback to old selected record here or onBeforeSelect?
    }
},

checkUserAction: function() {
    return new Promise((resolve) => {
        let me = this;

        Ext.Msg.show({
            buttons: Ext.Msg.YESNO,
            title: 'Confirm Discard Changes',
            msg: 'Do you want to discard changes?',
            callback: function(button) {
                if (button == 'yes') {
                    resolve(true);
                } else {
                    resolve(false);
                }
            }
        });
    });
}
怎么做


补充选择流程:

在模型(记录)上执行拒绝。在存储区上执行rejectChanges,这将对每条记录调用reject

编辑:-每条记录(Ext.data.Model或子体的实例)要么是新记录(phantom=true),要么是现有记录,要么是已修改的现有记录(dirty=true),要么是已擦除的现有记录(erased=true)。任何现有记录可能具有自最初加载或上次提交以来已更改的字段

将记录插入存储时,如果IDProperty设置了一个值,则该记录被视为现有记录;如果未设置值,则该记录是尚未提交的新记录(phantom=true),因此为“phantom”。与执行erase()方法的记录相同。它将被删除。记录仍在存储中,只是设置为“已擦除=真”。在数据库中保存的存储虚拟记录上执行sync()方法时,将保存修改的记录,并从数据库中删除已擦除的记录。所有这些更改是如何完成的,取决于模型的代理。。。。调用同步后,幻影记录不再是幻影,而是现有记录。已擦除的记录将从存储中删除,而已修改的记录不再被视为“脏”或已修改

如果在sync()之前对存储区执行拒绝更改,则存储区将恢复到上次sync()或load()之后的状态。幻影记录将被删除,已擦除的记录将恢复到未擦除状态,修改的记录将使所有更改恢复到更改之前的状态

因此,在您的情况下,将idProperty(在模型中)设置为记录的主键,并确保在将记录插入存储时它具有值。然后,当您对商店进行拒绝更改时,它将恢复到更改之前的状态。您可以在存储区上运行commitChanges(),将所有记录设置为未修改、非幻影和未擦除


仅供参考:如果您不传递id属性,sencha将为记录分配一个唯一的键,但仍将其设置为幻影(phantom=true)

Hi@mcg1103,测试该网格。getSelectionModel()没有拒绝函数。因此,当我调用grid.getStore().rejectChanges()时,grid中的所有记录都消失了。你可以分享一些代码以供参考吗?谢谢。我猜每个记录(Ext.data.Model)都设置了phantom=true。这意味着它是一个新记录(尚未保存在数据库/远程中),因此当您在存储上拒绝时,它将删除这些记录,因为它认为这些记录已添加且未保存。必须在模型上设置idProperty,并且在插入记录时,该属性必须具有值。当您从数据库加载记录时,它们有一个主键,因此idProperty将有一个值。@DaiKeung-我编辑了我的答案,以澄清有关存储的一些内容。您好@mcg1103,非常感谢您的详细解释。我添加了IDProperty来尝试,但仍然不好。我甚至尝试在插入数据存储后提交更改。我补充了预期的流程以供参考。请告知,谢谢。