extjs4 ajax api 商店更新

发布于 2024-12-12 02:38:56 字数 9828 浏览 0 评论 0原文

在使用单元格编辑和网格面板中的组合框更新记录后,我尝试更新我的商店和数据库。 ajax 代理中的更新操作.action 正确触发,只是存储和网格不同步,并且 firebug 中的 post 选项卡显示我的 json 如下所示:“data []”。如何获取商店记录以创建 json 并更新记录?感谢您提前查看此内容...

Ext.Loader.setConfig({
    enabled: true
});
Ext.Loader.setPath('Ext.ux', '/extjs4/examples/ux');
Ext.require([
    'Ext.layout.container.Fit',
    'Ext.grid.*',
    'Ext.data.*',
    'Ext.util.*',
    'Ext.panel.*',
    'Ext.selection.CellModel',
    'Ext.state.*',
    'Ext.form.*',
    'Ext.ux.CheckColumn']);

Ext.define('Ext.app.HirePlanGrid', {
    extend: 'Ext.panel.Panel',
    alias: 'widget.hirePlangrid',
    hireplanstoreId: 'hireplanstore',
    hiremonthstoreId: 'hiremonthstore'

    ,
    renderMonth: function (value, p, record) {
        var fkStore = Ext.getStore(this.up('hirePlangrid').hiremonthstoreId);
        var rec = fkStore.findRecord("MONTH_ID", value);
        //return rec.get("ABBREVIATED_MONTH");
    }

    ,
    initComponent: function () {
        var rIdx = '';
        var cIdx = '';

        this.editing = Ext.create('Ext.grid.plugin.CellEditing', {
            clicksToEdit: 1,
            listeners: {
                'beforeedit': function (e) {
                    var me = this;
                    var allowed = !! me.isEditAllowed;
                    if (!me.isEditAllowed) Ext.Msg.confirm('confirm', 'Are you sure?', function (btn) {
                        if (btn !== 'yes') return;
                        me.isEditAllowed = true;
                        me.startEditByPosition({
                            row: e.rowIdx,
                            column: e.colIdx
                        });
                    });
                    rIdx = e.rowIdx;
                    cIdx = e.colIdx;
                    // alert('rIdx= ' + rIdx + ' cIdx = ' + cIdx);
                    return allowed;
                },
                    'edit': function (e) {
                    this.isEditAllowed = true;
                }
            }
        });

        var objMonthStore = Ext.getStore(this.hiremonthstoreId);
        objMonthStore.load();
        var objStore = Ext.getStore(this.hireplanstoreId);
        objStore.setProxy({
            type: 'ajax',
            url: 'hireplan.cfc?method=getEmployees'
        });

        objStore.load();

        var onDeleteClick = function (field, value, options) {
            // var objPanel = this.down('gridpanel');
            var selection = Ext.getCmp('grid').getSelectionModel().getSelection();
            // alert(selection);
            //var selection = getView().getSelectionModel().getSelection()[r];
            if (value) {
                //alert(value);
                objStore.remove(value);
                objStore.sync();
            }
        };
        var onUpdateClick = function (field, value, options) {
            alert('field= ' + field + ' value= ' + value + 'options= ' + options);
            objStore.update(this.hireplanstoreId, value, 'update', options);
            onSync();

        };
        var onSync = function () {
            objStore.sync();
        };

        Ext.apply(this, {
            layout: 'fit',
            width: 800,
            //height: 1500,
            items: [{
                xtype: 'grid',
                id: 'gridgrid',
                //height: 300,
                store: objStore,
                selModel: {
                    selType: 'cellmodel'
                },
                selType: 'rowmodel',
                plugins: [this.editing],
                // plugins: [cellEditing],
                columnLines: true,
                viewConfig: {
                    stripeRows: true
                },
                //loadMask: true,
                disableSelection: true,
                columns: [{
                    header: 'rowid',
                    hidden: true,
                    dataIndex: 'ROWID'
                }, {
                    header: 'Indicator',
                    id: 'chkcolumn',
                    xtype: 'checkcolumn',
                    dataIndex: 'CHK_COL',
                    editor: {
                        xtype: 'checkbox',
                        cls: 'x-grid-checkheader-editor'
                    },
                    listeners: {
                        checkchange: function (column, recordIndex, checked) {
                            alert('checked rindex= ' + recordIndex);
                            onDeleteClick(column, recordIndex, checked);
                            //or send a request                    
                        }
                    }
                }, {
                    id: 'employeeid',
                    header: 'employeeid',
                    width: 80,
                    hidden: false,
                    sortable: true,
                    dataIndex: 'EMPLOYEEID',
                    flex: 1
                }, {
                    id: 'NATIONALIDNUMBER',
                    header: 'NATIONALIDNUMBER',
                    width: 80,
                    sortable: true,
                    dataIndex: 'NATIONALIDNUMBER',
                    flex: 1
                }, {
                    id: 'MARITALSTATUS',
                    header: 'MARITALSTATUS',
                    width: 80,
                    sortable: true,
                    dataIndex: 'MARITALSTATUS',
                    flex: 1
                }, {
                    id: 'PotentialforInsourcingKV',
                    header: 'Potential for Insourcing',
                    width: 30,
                    sortable: true,
                    dataIndex: 'POTENTIAL_FOR_INSOURCING',
                    flex: 1,
                    editor: {
                        id: 'thiscombo',
                        xtype: 'combobox',
                        typeAhead: true,
                        triggerAction: 'all',
                        selectOnTab: true,
                        store: [
                            ['1', 'Yes'],
                            ['0', 'No']
                        ],
                        lazyRender: true,
                        listClass: 'x-combo-list-small',
                        listeners: {
                            scope: this,
                                'select': function () {
                                var selval = Ext.getCmp('thiscombo').getValue();
                                var row = rIdx;
                                //alert(selval + ' ' +  rIdx); 
                                onUpdateClick('thiscombo', rIdx, selval);
                            }
                        }
                    }
                }, {
                    id: 'ABBREVIATED_MONTH',
                    header: 'ABBREVIATED_MONTH',
                    width: 80,
                    sortable: true,
                    dataIndex: 'ABBREVIATED_MONTH',
                    flex: 1,
                    renderer: this.renderMonth,
                    field: {
                        xtype: 'combobox',
                        store: Ext.getStore(this.hiremonthstoreId),
                        typeAhead: true,
                        lazyRender: true,
                        queryMode: 'local',
                        displayField: 'ABBREVIATED_MONTH',
                        valueField: 'MONTH_ID',
                        listClass: 'x-combo-list-small'

                    }
                }, {
                    id: 'SALARIEDFLAG',
                    header: 'SALARIEDFLAG',
                    width: 80,
                    sortable: true,
                    dataIndex: 'SALARIEDFLAG',
                    flex: 1
                }],

                features: [{
                    ftype: 'rowbody'
                }]
            }]
        });
        this.callParent(arguments);
    }, //initComponent
    onSelectChange: function (selModel, selections) {
        this.down('#delete').setDisabled(selections.length === 0);
    },
    viewConfig: {},
});
// JavaScript Document
// JavaScript Document
hireplanstore = Ext.create("Ext.data.Store", {
    model: 'HiringPlan',
    //autoLoad: true,
    //autoSync: true,
    buffered: true,
    storeId: 'hireplanstore',
    remoteFilter: true

    ,
    proxy: {
        type: 'ajax',
        simpleSortMode: true,
        api: {
            read: 'hireplan.cfc?method=GetEmployees',
            update: 'hireplan.cfc?method=upEmployees',
            destroy: 'hireplan.cfc?method=delEmployees'
        },
        reader: {
            type: 'json',
            messageProperty: 'message',
            successProperty: 'success',
            root: 'data'
        },
        writer: {
            type: 'json',
            writeAllFields: false,
            root: 'data'
        },
        listeners: {
            exception: function (proxy, response, operation) {
                Ext.MessageBox.show({
                    title: 'ERROR from store',
                    msg: operation.getError(),
                    icon: Ext.MessageBox.ERROR,
                    buttons: Ext.Msg.OK
                });
            }
        }
    }


});
//hireplanstore.pageSize = 10000;       
Ext.define('HiringPlan', {
    extend: 'Ext.data.Model',
    fields: [{
        name: 'ROWID',
        type: 'string'
    }, {
        name: 'EMPLOYEEID',
        type: 'string'
    }, {
        name: 'NATIONALIDNUMBER',
        type: 'string'
    }, {
        name: 'MARITALSTATUS',
        type: 'string'
    }, {
        name: 'GENDER',
        type: 'string'
    }, {
        name: 'POTENTIAL_FOR_INSOURCING',
        type: 'integer'
    }, {
        name: 'ABBREVIATED_MONTH',
        type: 'string'
    }, {
        name: 'SALARIEDFLAG',
        type: 'string'
    }, {
        name: 'CHK_COL',
        type: 'bool'
    }]

});

I'm trying to update my store and then database after using cellediting and a combobox in a gridpanel to update a record. The update operation.action in the ajax proxy is firing correctly, it just that the store and the grid aren't syncronizing, and the post tab in firebug says my json looks like this: 'data []'. How do I get the store record to create the json and update the record? Thanks for looking at this in advance...

Ext.Loader.setConfig({
    enabled: true
});
Ext.Loader.setPath('Ext.ux', '/extjs4/examples/ux');
Ext.require([
    'Ext.layout.container.Fit',
    'Ext.grid.*',
    'Ext.data.*',
    'Ext.util.*',
    'Ext.panel.*',
    'Ext.selection.CellModel',
    'Ext.state.*',
    'Ext.form.*',
    'Ext.ux.CheckColumn']);

Ext.define('Ext.app.HirePlanGrid', {
    extend: 'Ext.panel.Panel',
    alias: 'widget.hirePlangrid',
    hireplanstoreId: 'hireplanstore',
    hiremonthstoreId: 'hiremonthstore'

    ,
    renderMonth: function (value, p, record) {
        var fkStore = Ext.getStore(this.up('hirePlangrid').hiremonthstoreId);
        var rec = fkStore.findRecord("MONTH_ID", value);
        //return rec.get("ABBREVIATED_MONTH");
    }

    ,
    initComponent: function () {
        var rIdx = '';
        var cIdx = '';

        this.editing = Ext.create('Ext.grid.plugin.CellEditing', {
            clicksToEdit: 1,
            listeners: {
                'beforeedit': function (e) {
                    var me = this;
                    var allowed = !! me.isEditAllowed;
                    if (!me.isEditAllowed) Ext.Msg.confirm('confirm', 'Are you sure?', function (btn) {
                        if (btn !== 'yes') return;
                        me.isEditAllowed = true;
                        me.startEditByPosition({
                            row: e.rowIdx,
                            column: e.colIdx
                        });
                    });
                    rIdx = e.rowIdx;
                    cIdx = e.colIdx;
                    // alert('rIdx= ' + rIdx + ' cIdx = ' + cIdx);
                    return allowed;
                },
                    'edit': function (e) {
                    this.isEditAllowed = true;
                }
            }
        });

        var objMonthStore = Ext.getStore(this.hiremonthstoreId);
        objMonthStore.load();
        var objStore = Ext.getStore(this.hireplanstoreId);
        objStore.setProxy({
            type: 'ajax',
            url: 'hireplan.cfc?method=getEmployees'
        });

        objStore.load();

        var onDeleteClick = function (field, value, options) {
            // var objPanel = this.down('gridpanel');
            var selection = Ext.getCmp('grid').getSelectionModel().getSelection();
            // alert(selection);
            //var selection = getView().getSelectionModel().getSelection()[r];
            if (value) {
                //alert(value);
                objStore.remove(value);
                objStore.sync();
            }
        };
        var onUpdateClick = function (field, value, options) {
            alert('field= ' + field + ' value= ' + value + 'options= ' + options);
            objStore.update(this.hireplanstoreId, value, 'update', options);
            onSync();

        };
        var onSync = function () {
            objStore.sync();
        };

        Ext.apply(this, {
            layout: 'fit',
            width: 800,
            //height: 1500,
            items: [{
                xtype: 'grid',
                id: 'gridgrid',
                //height: 300,
                store: objStore,
                selModel: {
                    selType: 'cellmodel'
                },
                selType: 'rowmodel',
                plugins: [this.editing],
                // plugins: [cellEditing],
                columnLines: true,
                viewConfig: {
                    stripeRows: true
                },
                //loadMask: true,
                disableSelection: true,
                columns: [{
                    header: 'rowid',
                    hidden: true,
                    dataIndex: 'ROWID'
                }, {
                    header: 'Indicator',
                    id: 'chkcolumn',
                    xtype: 'checkcolumn',
                    dataIndex: 'CHK_COL',
                    editor: {
                        xtype: 'checkbox',
                        cls: 'x-grid-checkheader-editor'
                    },
                    listeners: {
                        checkchange: function (column, recordIndex, checked) {
                            alert('checked rindex= ' + recordIndex);
                            onDeleteClick(column, recordIndex, checked);
                            //or send a request                    
                        }
                    }
                }, {
                    id: 'employeeid',
                    header: 'employeeid',
                    width: 80,
                    hidden: false,
                    sortable: true,
                    dataIndex: 'EMPLOYEEID',
                    flex: 1
                }, {
                    id: 'NATIONALIDNUMBER',
                    header: 'NATIONALIDNUMBER',
                    width: 80,
                    sortable: true,
                    dataIndex: 'NATIONALIDNUMBER',
                    flex: 1
                }, {
                    id: 'MARITALSTATUS',
                    header: 'MARITALSTATUS',
                    width: 80,
                    sortable: true,
                    dataIndex: 'MARITALSTATUS',
                    flex: 1
                }, {
                    id: 'PotentialforInsourcingKV',
                    header: 'Potential for Insourcing',
                    width: 30,
                    sortable: true,
                    dataIndex: 'POTENTIAL_FOR_INSOURCING',
                    flex: 1,
                    editor: {
                        id: 'thiscombo',
                        xtype: 'combobox',
                        typeAhead: true,
                        triggerAction: 'all',
                        selectOnTab: true,
                        store: [
                            ['1', 'Yes'],
                            ['0', 'No']
                        ],
                        lazyRender: true,
                        listClass: 'x-combo-list-small',
                        listeners: {
                            scope: this,
                                'select': function () {
                                var selval = Ext.getCmp('thiscombo').getValue();
                                var row = rIdx;
                                //alert(selval + ' ' +  rIdx); 
                                onUpdateClick('thiscombo', rIdx, selval);
                            }
                        }
                    }
                }, {
                    id: 'ABBREVIATED_MONTH',
                    header: 'ABBREVIATED_MONTH',
                    width: 80,
                    sortable: true,
                    dataIndex: 'ABBREVIATED_MONTH',
                    flex: 1,
                    renderer: this.renderMonth,
                    field: {
                        xtype: 'combobox',
                        store: Ext.getStore(this.hiremonthstoreId),
                        typeAhead: true,
                        lazyRender: true,
                        queryMode: 'local',
                        displayField: 'ABBREVIATED_MONTH',
                        valueField: 'MONTH_ID',
                        listClass: 'x-combo-list-small'

                    }
                }, {
                    id: 'SALARIEDFLAG',
                    header: 'SALARIEDFLAG',
                    width: 80,
                    sortable: true,
                    dataIndex: 'SALARIEDFLAG',
                    flex: 1
                }],

                features: [{
                    ftype: 'rowbody'
                }]
            }]
        });
        this.callParent(arguments);
    }, //initComponent
    onSelectChange: function (selModel, selections) {
        this.down('#delete').setDisabled(selections.length === 0);
    },
    viewConfig: {},
});
// JavaScript Document
// JavaScript Document
hireplanstore = Ext.create("Ext.data.Store", {
    model: 'HiringPlan',
    //autoLoad: true,
    //autoSync: true,
    buffered: true,
    storeId: 'hireplanstore',
    remoteFilter: true

    ,
    proxy: {
        type: 'ajax',
        simpleSortMode: true,
        api: {
            read: 'hireplan.cfc?method=GetEmployees',
            update: 'hireplan.cfc?method=upEmployees',
            destroy: 'hireplan.cfc?method=delEmployees'
        },
        reader: {
            type: 'json',
            messageProperty: 'message',
            successProperty: 'success',
            root: 'data'
        },
        writer: {
            type: 'json',
            writeAllFields: false,
            root: 'data'
        },
        listeners: {
            exception: function (proxy, response, operation) {
                Ext.MessageBox.show({
                    title: 'ERROR from store',
                    msg: operation.getError(),
                    icon: Ext.MessageBox.ERROR,
                    buttons: Ext.Msg.OK
                });
            }
        }
    }


});
//hireplanstore.pageSize = 10000;       
Ext.define('HiringPlan', {
    extend: 'Ext.data.Model',
    fields: [{
        name: 'ROWID',
        type: 'string'
    }, {
        name: 'EMPLOYEEID',
        type: 'string'
    }, {
        name: 'NATIONALIDNUMBER',
        type: 'string'
    }, {
        name: 'MARITALSTATUS',
        type: 'string'
    }, {
        name: 'GENDER',
        type: 'string'
    }, {
        name: 'POTENTIAL_FOR_INSOURCING',
        type: 'integer'
    }, {
        name: 'ABBREVIATED_MONTH',
        type: 'string'
    }, {
        name: 'SALARIEDFLAG',
        type: 'string'
    }, {
        name: 'CHK_COL',
        type: 'bool'
    }]

});

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

红衣飘飘貌似仙 2024-12-19 02:38:56

为了正确更新你的ajax或rest调用必须返回一个包含更新记录的数组,即使它是一条记录,你也必须在一个数组中返回它,一个示例json响应(对于rest代理)应该像这样:

[{'id': 1, 'name': 'test', 'foo': 'bar'}]

In order to update correctly your ajax or rest call have to return an array containing the updated records, even if it's a single record, you have to return it inside an array, a sample json response (for the rest proxy) should be like this:

[{'id': 1, 'name': 'test', 'foo': 'bar'}]
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文