代码之家  ›  专栏  ›  技术社区  ›  Masquitos

从DB extjs6动态设置网格id

  •  0
  • Masquitos  · 技术社区  · 8 年前

    该网格从postgres表中获取数据。 此表使用4个用户。 问题是,如果用户B在id为5的表中创建一行,那么用户a可能不知道。因此,当用户A创建一行时,他应该知道最后一个id是什么,或者创建一行并返回行id。

    当我在网格中按“添加”按钮时,extjs向服务器发送“create”命令,服务器重新运行“success:true”和postgres表中新创建的“id”行数。 我想在我的网格中显示和使用这个“Id”。 例如,如果我添加一行,并从服务器获取“id:19”,我必须在和网格中创建19行。当我想要编辑此行时,etxjs必须发送到服务器更新,并使用“id:20”。

    <!DOCTYPE html>
    <html>
    
    <head>
        <meta charset="utf-8">
        <link rel="stylesheet" type="text/css" href="/extjs/ext-6.2.0/build/classic/theme-classic/resources/theme-classic-all.css" />
        <script type="text/javascript" src="/extjs/ext-6.2.0/build/ext.js"></script>
        <script type="text/javascript" src="/extjs/ext-6.2.0/build/ext-all.js"></script>
        <script type="text/javascript">
            Ext.require(['Ext.data.*', 'Ext.grid.*']);
    
    
            // Создаем model
            Ext.define('Users', {
                extend: 'Ext.data.Model',
                idProperty: 'id',
                //idProperty: 'id',
                fields: [{
                        name: 'id',
                        type: 'int',
                        mapping: 'id'
                    },
                    //{name: 'date', type: 'date', dateFormat: 'Y-m-d'}
                    // {
                    //     name: 'time',
                    //     type: 'date',
                    //     dateFormat: 'H:i'
                    // },
                ]
            });
    
            // var occupationStore = Ext.create('Ext.data.Store', {
            //     fields: ['time'],
            //     data: [{
            //             time: 'CEO'
            //         },
            //         {
            //             time: 'Vicepresident'
            //         },
            //         {
            //             time: 'Marketing manager'
            //         },
            //     ]
            // });
    
            Ext.onReady(function() {
                // Создаем store
                var store = Ext.create('Ext.data.Store', {
                        autoLoad: true,
                        autoSync: true,
                        model: 'Users',
                        proxy: {
                            type: 'ajax',
                            url: 's.rakov.php',
                            api: {
                                create: 's.rakov.php?action=create',
                                read: 's.rakov.php?action=read',
                                update: 's.rakov.php?action=update',
                                destroy: 's.rakov.php?action=delete'
                            },
                            reader: {
                                type: 'json',
                                rootProperty: 'data'
                            },
                            writer: {
                                type: 'json',
                                encode: true,
                                rootProperty: 'dataUpdate',
                                allowSingle: false,
                                writeAllFields: true,
                                //root:'records'
                            },
                            actionMethods: {
                                create: 'GET',
                                read: 'GET',
                                update: 'GET',
                                destroy: 'GET'
    
                            }
                        },
                        listeners: {
                            write: function(store, operation) {
                                var record = operation.getRecords()[0],
                                    name = Ext.String.capitalize(operation.action),
                                    verb;
    
    
                                if (name == 'Destroy') {
                                    verb = 'Destroyed';
                                } else {
                                    verb = name + 'd';
                                }
                                //Ext.example.msg(name, Ext.String.format("{0} user: {1}", verb, record.getId()));
    
                            }
                        }
                    }
    
    
                );
    
                var grid = Ext.create('Ext.grid.Panel', {
                    renderTo: document.body,
                    //plugins: [rowEditing],
                    // Редактирование
                    plugins: {
                        ptype: 'cellediting',
                        clicksToEdit: 1
                    },
                    listeners: {
                        edit: function() {
    
                        }
                    },
                    width: '99,3%',
                    height: 330,
                    frame: true,
                    title: 'Users',
                    store: store,
                    iconCls: 'icon-user',
                    columns: [{
                            text: 'id',
                            width: '2%',
                            sortable: true,
                            dataIndex: 'id',
                            renderer: function(v, meta, rec) {
                                return rec.phantom ? '' : v;
                            }
                        },
                         {
                            header: 'Задача',
                            width: '30%',
                            // sortable: true,
                            dataIndex: 'task',
                            editor: {
                                completeOnEnter: false,
                                field: {
                                    xtype: 'textfield',
                                    //name: 'timeStart1',
                                    //fieldLabel: 'Time In',
                                    anchor: '100%',
                                    allowBlank: false
                                }
                            }
                        },
                        {
                            header: 'Время начала',
                            width: 120,
                            // sortable: true,
                            dataIndex: 'time_start',
                            //format: 'H:i',
                            // Нужно для верного отображеия времени после редактирования в таблице
                            renderer: Ext.util.Format.dateRenderer('H:i'),
                            editor: {
                                completeOnEnter: false,
                                field: {
                                    xtype: 'timefield',
                                    format: 'H:i',
                                    //name: 'timeStart1',
                                    //fieldLabel: 'Time In',
                                    minValue: '8:00',
                                    maxValue: '20:00',
                                    increment: 30,
                                    anchor: '100%',
                                    //allowBlank: false
                                }
                            }
                        },
                        {
                            header: 'Результат',
                            width: '30%',
                            // sortable: true,
                            dataIndex: 'task_result',
                            editor: {
                                completeOnEnter: false,
                                field: {
                                    xtype: 'textfield',
                                    //name: 'timeStart1',
                                    //fieldLabel: 'Time In',
                                    //anchor: '100%',
                                    allowBlank: false
                                }
                            }
                        },
    
                        {
                            header: 'Время конца',
                            width: 120,
                            // sortable: true,
                            dataIndex: 'time_end',
                            //format: 'H:i',
                            // Нужно для верного отображеия времени после редактирования в таблице
                            renderer: Ext.util.Format.dateRenderer('H:i'),
                            editor: {
                                completeOnEnter: false,
                                field: {
                                    xtype: 'timefield',
                                    format: 'H:i',
                                    //name: 'timeStart1',
                                    //fieldLabel: 'Time In',
                                    minValue: '8:00',
                                    maxValue: '20:00',
                                    increment: 30,
                                    anchor: '100%',
                                    allowBlank: false
                                }
                            }
                        },
                        {
                            header: 'Дата',
                            width: 70,
                            // sortable: true,
                            dataIndex: 'date',
                            renderer: Ext.util.Format.dateRenderer('d/m/Y'),
                            editor: {
                                completeOnEnter: false,
                                field: {
                                    xtype: 'datefield',
                                    dateFormat: 'd/m/Y',
                                    allowBlank: false
                                }
                            }
                        },
                        {
                            header: 'Длительность',
                            width: 60,
                            // sortable: true,
                            dataIndex: 'time_duration'
                        },
    
                        // {
         //                    header: 'Тип задачи',
         //                    width: 120,
         //                    // sortable: true,
         //                    dataIndex: 'task_type',
         //                    editor: {
         //                        completeOnEnter: false,
         //                        field: {
         //                            xtype: 'combobox',
         //                            //name: 'timeStart1',
         //                            //fieldLabel: 'Time In',
         //                            anchor: '100%',
         //                            allowBlank: false
         //                        }
         //                    }
         //                }
    
                    ],
                    dockedItems: [{
                        xtype: 'toolbar',
                        items: [{
                            text: 'Add',
                            iconCls: 'icon-add',
                            handler: function() {
                                // Создаем новую задачу
                                // Для корректной работы с БД нужно задать ID новой строки, равной +1 от последней ID из таблицы.
                                var rec = new Users();
                                //console.log (x);("rec data= " + rec.id + " -- " + rec.data.id);
                                var idArr = grid.store.data.items;
                                var idValue = [];
                                for (var i = 0; i < idArr.length; i++) {
                                    idValue.push(idArr[i].id);
                                }
                                idValue.sort(function(a, b) {
                                    return a - b;
                                });
                                var maxId = idValue[idValue.length - 1];
                                console.log(maxId);
                                //rec.id = maxId + 1;
                                //rec.data.id = maxId + 1;
    
                                rec.date = Ext.Date.format(new Date(), 'Y-m-d\\T00:00:00');
                                rec.data.date = Ext.Date.format(new Date(), 'Y-m-d\\T00:00:00');
    
                                rec.time_start = Ext.Date.format(new Date(), '2008-01-01\\TH:i:s');
                                rec.data.time_start = Ext.Date.format(new Date(), '2008-01-01\\TH:i:s');
                                store.insert(0, rec);
                                //store.add(rac);
                                //grid.getView().refresh();
                                // rowEditing.startEdit(rec, 0);
                            }
                        }, '-', {
                            itemId: 'delete',
                            text: 'Delete',
                            iconCls: 'icon-delete',
                            disabled: false,
                            handler: function() {
                                var selection = grid.getView().getSelectionModel().getSelection()[0];
                                if (confirm('Вы действительно хотите удалить задачу №' + selection.id + " ?")) {
                                    // Удлаяем      
                                    if (selection) {
                                        store.remove(selection);
                                    }
                                }
                            }
                        }]
                    }]
                });
            });
        </script>
    </head>
    
    <body>
        <div id="gridDiv"></div>
    </body>
    
    </html>
    
    1 回复  |  直到 8 年前
        1
  •  0
  •   Alexander    8 年前

    我为你做了一把小提琴: https://fiddle.sencha.com/#view/editor&fiddle/226o

    简而言之,当客户端向服务器发送带有主体的创建请求时,例如。

    {"updateData":[{"task":"Test", "id":"ext-task-46"},{"task":"Test 2", id: "ext-task-47"}]}
    

    updateData 成为你的作家 rootProperty

    {"success":true,"data":[{"task:"Test","id":5},{"task:"Test 2","id":6}]
    

    {"success":true,"data":[{"id":5},{"id":6}]
    

    ( data 成为读者的 根属性 ). id更新的提交记录和返回记录之间的匹配是按位置进行的;所有其他字段也可以更新。

    因此,服务器可以将服务器对提交的记录强制执行的任何更改返回给客户端; except for the fact that certain records could not be created .