【问题标题】:Refreshing gridpanel after removing newly added record from store从商店中删除新添加的记录后刷新网格面板
【发布时间】:2015-04-17 04:20:33
【问题描述】:

如何从网格面板中删除新添加的行?网格面板绑定到商店。

我用:

store.remove(record);
store.sync();

它适用于网格中的现有记录,记录直接从网格中删除,但是当我添加记录并想立即将其删除时,它并没有从网格中“删除”。

调用了 api,因此记录被“从数据库中删除”,并且当我这样做时记录确实消失了,例如浏览器刷新。

有人知道这是怎么回事吗?提前致谢。

存储配置

Ext.define('Iziezie.store.animal.doggywood.animal', {
    extend: 'Iziezie.store.animal.animal',

    model: 'Iziezie.model.animal.doggywood.animal',

    proxy: {
        type: 'baseProxy',
        api: {
            create: '../php/api/doggywood_animals.php?request=create',
            read: '../php/api/doggywood_animals.php?request=read',
            update: '../php/api/doggywood_animals.php?request=update',
            destroy:  '../php/api/doggywood_animals.php?request=destroy'
        }

    }

});

新记录按表格添加:

var store = gridpanel.getStore();
var model = Ext.ModelMgr.getModel(store.model);

var record = model.create();
store.insert(0, record);

...

frm.loadRecord(record);

在表单提交时

frm.updateRecord();
var record = frm.getRecord();
record.save();

删除时:

var sm = gridpanel.getSelectionModel();
var record = sm.getLastSelected();
var store = gridpanel.getStore();

store.remove(record);
store.sync();

【问题讨论】:

    标签: extjs extjs4.2


    【解决方案1】:

    要在网格上强制进行视觉刷新,您只需调用

    myGridPanel.getView().refresh();
    

    但这不应该是必需的,网格应该只显示您商店中的任何内容。你能发布你正在做什么的完整代码示例吗?

    【讨论】:

    • Thnx,我试过 myGridPanel.getView().refresh();但这并没有奏效。不幸的是,无法发布紧凑的代码示例。我希望这是一个已知问题。
    • 您能否至少发布一些代码的小部分,例如您的网格和存储配置?
    • 记录出现在网格面板中,并在表单更新时更新,但我发现它不知何故不在商店中:IndexOf = -1。
    • frm.getRecord() 之后 indexOf 变为 -1,而 store 仍然连接到记录。
    【解决方案2】:

    尝试使用行编辑在网格面板中创建新记录:

    createRecord: function() {
        var model = Ext.ModelMgr.getModel('EKOJS.model.m_yourmodel');
        var r = Ext.ModelManager.create({
            id: '',
            text: ''
        }, model);
        this.getYourgridaliasview().getStore().insert(0, r);
        this.getYourgridaliasview().rowEditing.startEdit(0, 0);
    },
    

    并删除网格面板中的选定记录:

    deleteRecord: function(dataview, selections) {
        var getstore = this.getYourgridaliasview().getStore();
        var selection = this.getYourgridaliasview().getSelectionModel().getSelection()[
            0];
        if (selection) {
            Ext.Msg.confirm('Confirmation',
                'Are you sure to delete this data: id = "' + selection.data
                .id + '"?', function(btn) {
                    if (btn == 'yes') {
                        getstore.remove(selection);
                        getstore.sync();
                    }
                });
        }
    },
    

    而且,重要的是在创建这样的记录后总是重新加载您的商店:

    Ext.Ajax.request({
        method: 'POST',
        url: '../php/api/doggywood_animals.php?request=create',
        params: {
            data: jsonData
        },
        success: function(response) {
            e.store.reload({
                callback: function() {
                    var newRecordIndex = e.store.findBy(
                        function(record, id) {
                            if (record.get('id') === e.record
                                .data.id) {
                                return true;
                            }
                            return false;
                        });
                    /* me.grid.getView().select(recordIndex); */
                    me.grid.getSelectionModel().select(
                        newRecordIndex);
                }
            });
        }
    });
    

    我使用的行编辑插件中编辑后的监听器如下:

    'afteredit': function(editor, e) {
        var me = this;
        if ((/^\s*$/).test(e.record.data.id)) {
            Ext.Msg.alert('Peringatan', 'Kolom "id" tidak boleh kosong.');
            return false;
        }
        /* e.store.sync();
                        return true; */
        var jsonData = Ext.encode(e.record.data);
        Ext.Ajax.request({
            method: 'POST',
            url: '../php/api/doggywood_animals.php?request=create',
            params: {
                data: jsonData
            },
            success: function(response) {
                e.store.reload({
                    callback: function() {
                        var newRecordIndex = e.store.findBy(
                            function(record, id) {
                                if (record.get('id') ===
                                    e.record.data.id
                                ) {
                                    return true;
                                }
                                return false;
                            });
                        /* me.grid.getView().select(recordIndex); */
                        me.grid.getSelectionModel().select(
                            newRecordIndex);
                    }
                });
            }
        });
        return true;
    }
    

    可能对你有点帮助。

    【讨论】:

    • 感谢您的回答,但我必须使用表单,因为模型中的字段比网格中的字段多。
    • 在 store.sync() 之后尝试 store.reload()
    猜你喜欢
    • 1970-01-01
    • 2016-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-11
    • 1970-01-01
    相关资源
    最近更新 更多