• 对于Ext.data.Store 介紹 与总结,以及对以前代码的重构与优化


         对于Ext.data.Store 一直不是很了解,不知道他到底是干嘛的有哪些用处,在实际开发中也由于不了解也走了不少弯路,

    store是一个为Ext器件提供record对象的存储容器,行为和属性都很象数据表.

      由于刚学不是太懂,都是比葫芦画瓢,东搬西畴的去完成功能.程序思路都是自己想象的,对于rest方式的增删改查全是采用另外一种方式去实现的,最后研究发现其实,store都

    已经有了这些函数,根本不用自己去实现.下面看下以前所写的代码:这是model,store ,gridpanel

    var store;
    Ext.onReady(function () {
        //接口管理model
        Ext.define('InterfaceModel', {
            extend: 'Ext.data.Model',
            fields: [{
                name: 'ID',
                type: 'int',
                useNull: true
            }, 'FunctionCode', 'FunctionName', 'IsEnabled', 'Invoker', 'Module'],
            validations: [{
                type: 'length',
                field: 'FunctionCode',
                min: 1
            }, {
                type: 'length',
                field: 'FunctionName',
                min: 1
            }, {
                type: 'length',
                field: 'Invoker',
                min: 1
            }]
            //        proxy: {
            //            type: 'rest',
            //            url: 'api/InterfaceManage'
            //        }
    
        });
    
        //接口数据加载
        store = Ext.create('Ext.data.Store', {
            autoLoad: true,
            autoSync: true,
            pageSize: 20,
            model: 'InterfaceModel',
            proxy: {
                type: 'rest',
                url: 'api/InterfaceManage',
                reader: {
                    type: 'json',
                    root: 'Data',
                    totalProperty: 'TotolRecord'
                },
                writer: {
                    type: 'json'
                }
            }
    
        });
    
        //删除单条接口信息
        function OnDelete(id) {
            $.ajax({
                type: 'DELETE',
                url: '/api/InterfaceManage/' + id,
                data: {},
                contentType: "application/json; charset=utf-8",
                dataType: 'json',
                success: function (results) {
                    store.load();
                }
            })
        }
    
        //单选checkbox模式
        var selModel = Ext.create('Ext.selection.CheckboxModel', {
             55,
            injectCheckbox: 1,
            listeners: {
                selectionchange: function (sm, selections) {
                    grid.down('#removeButton').setDisabled(selections.length === 0);
                    grid.down('#editButton').setDisabled(selections.length === 0);
                }
            }
        });
    
    
        //接口数据渲染
        var grid = Ext.create('Ext.grid.GridPanel', {
            id: 'node_Interface',
             400,
            height: 300,
            frame: true,
            title: '接口管理',
            store: store,
            iconCls: 'icon-user',
            selModel: selModel,
            border: false, //grid的边界 
    
            listeners: {
                itemdblclick: function (grid, rowIndex, e) {
    
                    var record = grid.getSelectionModel().getSelection()[0];
                    if (record) {
                        UpdateInterface();
    
                        //更新功能
                        Ext.getCmp('BtnSave_newsinfo').on('click', function () {
                            OnUpdate(record.get('ID'));
                        });
                        Ext.getCmp('code').setValue(record.get('FunctionCode'));
                        Ext.getCmp('name').setValue(record.get('FunctionName'));
                        Ext.getCmp('isEnable').setValue(record.get('IsEnabled'));
                        Ext.getCmp('Invoker').setValue(record.get('Invoker'));
                        Ext.getCmp('Module').setValue(record.get('Module'));
                    }
                    else {
                        Ext.Msg.alert('提示', '请选择要编辑的内容');
                    }
                }
            },
            columns: [Ext.create('Ext.grid.RowNumberer', {  35, text: '序号' }), {
                text: '编号',
                 40,
                sortable: true,
                hideable: false,
                dataIndex: 'ID'
            }, {
                text: '接口代码',
                 80,
                sortable: true,
                dataIndex: 'FunctionCode',
                field: {
                    xtype: 'textfield'
                }
            }, {
                header: '接口名称',
                 120,
                sortable: true,
                dataIndex: 'FunctionName',
                field: {
                    xtype: 'textfield'
                }
            }, {
                text: '是否启用',
                 80,
                // xtype: 'checkcolumn',
                dataIndex: 'IsEnabled',
                renderer: function boolFromValue(val) {
    
                    if (val) {
                        return '<img src=../../Content/images/true.png>'
                    }
                    else {
                        return '<img src=../../Content/images/false.png>'
                    }
                }
            }, {
                text: '调用者',
                 100,
                sortable: true,
                dataIndex: 'Invoker',
                field: {
                    xtype: 'textfield'
                }
            }, {
                text: '所属模块',
                 100,
                sortable: true,
                dataIndex: 'Module',
                field: {
                    xtype: 'textfield'
                }
            }],
            bbar: Ext.create('Ext.PagingToolbar', {
                plugins: [new Ext.ux.ComboPageSize({})],
                store: store, //---grid panel的数据源
                displayInfo: true,
                displayMsg: '显示 {0} - {1} 条,共计 {2} 条',
                emptyMsg: "没有数据"
            }),
            dockedItems: [{
                xtype: 'toolbar',
                items: [{
                    text: '添加',
                    iconCls: 'icon-add',
                    handler:
                    function () {
                        AddInterface();
                        store.reload();
                    }
                }, '-', {
                    itemId: 'removeButton',
                    text: '删除',
                    iconCls: 'icon-delete',
                    disabled: true,
                    handler: function () {
                        var selection = grid.getSelectionModel().getSelection();
                        var len = selection.length;
    
                        if (len == 0) {
                            Ext.Msg.alert('提示', '请先选择要删除的数据');
                        }
                        else {
                            Ext.Msg.show({
                                title: '系统确认',
                                msg: '你是否确定删除这些数据!',
                                buttons: Ext.Msg.YESNO,
                                scope: this,
                                fn: function (btn) {
                                    if (btn == 'yes') {
                                        for (var i = 0; i < len; i++) {
                                            var id = selection[i].get('ID');
                                            OnDelete(id);
                                            //console.log(selection[i]);
                                            //store.remove(selection[i]);
                                        }
                                    }
                                }, icon: Ext.MessageBox.QUESTION
    
                            });
                        }
                    }
                }, '-', {
                    itemId: 'editButton',
                    text: '编辑',
                    disabled: true,
                    iconCls: 'icon-edit',
    
                    handler:
                                 function () {
                                     var record = grid.getSelectionModel().getSelection()[0];
    
                                     if (record) {
                                         UpdateInterface();
    
                                         //更新功能
                                         Ext.getCmp('BtnSave_newsinfo').on('click', function () {
                                             OnUpdate(record.get('ID'));
                                         });
                                         Ext.getCmp('code').setValue(record.get('FunctionCode'));
                                         Ext.getCmp('name').setValue(record.get('FunctionName'));
                                         Ext.getCmp('isEnable').setValue(record.get('IsEnabled'));
                                         Ext.getCmp('Invoker').setValue(record.get('Invoker'));
                                         Ext.getCmp('Module').setValue(record.get('Module'));
                                     }
                                     else {
                                         Ext.Msg.alert('提示', '请选择你要编辑的内容');
                                     }
                                 }
                }]
    
            }]
        });

    添加函数

    // Copyright : .  All rights reserved.
    // 文件名:AddInterfac.js
    // 文件描述:添加接口信息
    //-----------------------------------------------------------------------------------
    // 创建者:
    // 创建时间:2013-06-20
    //====================================================================================
    
    Ext.require([
        'Ext.form.*',
        'Ext.layout.container.Absolute',
        'Ext.window.Window'
    ]);
    
    var win;//窗口
    function  AddInterface() {
        var form = Ext.create('Ext.form.Panel', {
            
            border: false,
            bodyPadding: 20,
            border: 1, //边框
            frame: true, //
            defaults: {//统一设置表单字段默认属性
                //autoFitErrors : false,//展示错误信息时是否自动调整字段组件宽度
                labelSeparator: ':', //分隔符
                labelWidth: 100, //标签宽度
                 350, //字段宽度
                allowBlank: false, //是否允许为空
                blankText: '不允许为空', //若设置不为空,为空时的提示
                labelAlign: 'right', //标签对齐方式
                msgTarget: 'qtip'          //显示一个浮动的提示信息
                //msgTarget :'title'       //显示一个浏览器原始的浮动提示信息
                //msgTarget :'under'       //在字段下方显示一个提示信息
                //msgTarget :'side'        //在字段的右边显示一个提示信息
                //msgTarget :'none'        //不显示提示信息
                //msgTarget :'errorMsg'    //在errorMsg元素内显示提示信息
            },
    
    
            items: [{
                xtype: 'textfield',
                fieldLabel: '接口代码',
                id: 'code',
                anchor: '90%'
            },
                            {
                                xtype: 'textfield',
                                fieldLabel: '接口名称',
                                id:'name',
                                name:'name',
                                anchor: '90%'
                            },
                            {
                                xtype: 'checkbox',
                              
                                fieldLabel: '是否启用',
                                boxLabel: '',
                                id: 'isEnable',
                                anchor: '90%'
                            },
                            {
                                xtype: 'textfield',
                                fieldLabel: '调 用 者',
                                id: 'Invoker',
                                anchor: '90%'
                            },
                            {
                                xtype: 'textfield',
                                fieldLabel: '所属模块',
                                id: 'Module',
                                anchor: '90%'
                            }
               ]
        });
    
         win = Ext.create('Ext.window.Window', {
            autoShow: true,
            title: '接口添加',
             400,
            height: 250,
            minWidth: 300,
            minHeight: 200,
            buttonAlign: 'center',
            modal: true,
            resizable: false,
            layout: 'fit',
            plain: true,
            items: form,
    
            buttons: [{
                text: '确定',
                handler: function () {
                    OnInsert();
                }
            }, {
                text: '取消',
                handler: function () {
                    win.close();
                }
            }]
        });
    };
    
    //添加接口函数
    function OnInsert(evt) {
        var functionCode = Ext.getCmp('code').getValue();
        var FunctionName = Ext.getCmp('name').getValue();
        var IsEnabled = Ext.getCmp('isEnable').getValue();
        var Invoker = Ext.getCmp('Invoker').getValue();
        var module = Ext.getCmp('Module').getValue();
    
        var data = '{"ID":"' + '' + '","FunctionCode":"' + functionCode + '","FunctionName":"' + FunctionName + '","IsEnabled":"' + IsEnabled + '","Invoker":"' + Invoker + '","Module":"' + module + '"}';
    
        $.ajax({
            type: 'POST',
            url: '/api/InterfaceManage',
            data: data,
            contentType: "application/json; charset=utf-8",
            dataType: 'json',
            success: function (results) {
                Ext.Msg.alert('添加提示', '添加成功!');
                store.reload();
                win.close();
            }
        })
    
    }

    修改函数:

    // Copyright : .  All rights reserved.
    // 文件名:UpdateInterface.js
    // 文件描述:更新接口信息
    //-----------------------------------------------------------------------------------
    // 创建者:
    // 创建时间:2013-06-20
    //====================================================================================
    
    Ext.require([
        'Ext.form.*',
        'Ext.layout.container.Absolute',
        'Ext.window.Window'
    ]);
    var win;
    function UpdateInterface() {
        var form = Ext.create('Ext.form.Panel', {
    
            border: false,
            bodyPadding: 20,
            border: 1, //边框
            frame: true, //
            defaults: {//统一设置表单字段默认属性
                //autoFitErrors : false,//展示错误信息时是否自动调整字段组件宽度
                labelSeparator: ':', //分隔符
                labelWidth: 120, //标签宽度
                 350, //字段宽度
                allowBlank: false, //是否允许为空
                blankText: '不允许为空', //若设置不为空,为空时的提示
                labelAlign: 'right', //标签对齐方式
                msgTarget: 'qtip'          //显示一个浮动的提示信息
                //msgTarget :'title'       //显示一个浏览器原始的浮动提示信息
                //msgTarget :'under'       //在字段下方显示一个提示信息
                //msgTarget :'side'        //在字段的右边显示一个提示信息
                //msgTarget :'none'        //不显示提示信息
                //msgTarget :'errorMsg'    //在errorMsg元素内显示提示信息
            },
    
    
            items: [{
                xtype: 'textfield',
                fieldLabel: '接口代码',
                id: 'code',
                anchor: '90%'
            },
                            {
                                xtype: 'textfield',
                                fieldLabel: '接口名称',
                                id: 'name',
                                name: 'name',
                                anchor: '90%'
                            },
                            {
                                xtype: 'checkbox',
    
                                fieldLabel: '是否启用',
                                boxLabel: '',
                                id: 'isEnable',
                                anchor: '90%'
                            },
                            {
                                xtype: 'textfield',
                                fieldLabel: '调 用 者',
                                id: 'Invoker',
                                anchor: '90%'
                            },
                            {
                                xtype: 'textfield',
                                fieldLabel: '所属模块',
                                id: 'Module',
                                anchor: '90%'
                            }
               ]
        });
    
        win = Ext.create('Ext.window.Window', {
            autoShow: true,
            title: '接口更新',
             400,
            height: 250,
            resizable: false,
            buttonAlign: 'center',
            minWidth: 300,
            minHeight: 200,
            layout: 'fit',
            plain: true,
            items: form,
            modal: true,
            buttons: [{
                text: '更新',
                id: 'BtnSave_newsinfo'
    
            }, {
                text: '取消',
                handler: function () {
                    win.close();
                }
            }]
        });
    };
    
    //更新数据
    function OnUpdate(id) {
        //获取要更新的数据
        var functionCode = Ext.getCmp('code').getValue();
        var FunctionName = Ext.getCmp('name').getValue();
        var IsEnabled = Ext.getCmp('isEnable').getValue();
        var Invoker = Ext.getCmp('Invoker').getValue();
        var module = Ext.getCmp('Module').getValue();
    
        var data = '{"ID":"' + id + '","FunctionCode":"' + functionCode + '","FunctionName":"' + FunctionName + '","IsEnabled":"' + IsEnabled + '","Invoker":"' + Invoker + '","Module":"' + module + '"}';
    
        $.ajax({
            type: 'PUT',
            url: '/api/InterfaceManage/' + id,
            data: data,
            contentType: "application/json; charset=utf-8",
            dataType: 'json',
            success: function (results) {
                Ext.Msg.alert('提示', '更新成功!');
                store.reload();
                win.close();
            }
        })
    
    }

    删除函数,包含到上面那部分代码中了.下面我们一步一步来优化代码:

    1. 修改删除函数:
      原先的OnDelete函数全部去掉,在相应的删除事件中添加

      store.remove(selection[i]);

      这样他就会自动调用rest对应的delete方式,将要删除的对象传到后台.还没完,使用OnDelete函数传到后台的是id,而使用remove传到后台的是model对象,所以后台

      接受的参数需要进行相应的改变.

    2. 修改添加函数:去掉了重新写的往后台传值方式,直接调用Rest的Post方式,修改后的OnInsert函数如下:
      //添加接口函数
      function OnInsert(evt) {
          var functionCode = Ext.getCmp('code').getValue();
          var FunctionName = Ext.getCmp('name').getValue();
          var IsEnabled = Ext.getCmp('isEnable').getValue();
          var Invoker = Ext.getCmp('Invoker').getValue();
          var module = Ext.getCmp('Module').getValue();
      
          var newInterfaceModel = new InterfaceModel(
          {
              ID: '',
              FunctionCode: functionCode,
              FunctionName: FunctionName,
              IsEnabled: IsEnabled,
              Invoker: Invoker,
              Module: module
              });
      
          store.insert(0, newInterfaceModel);
          store.reload();
          win.close();
      }

      这种方式直接调用store的insert()方法,insert方法所对应的就是post方式.



    3. 对update函数的修改:

  • 相关阅读:
    空间换时间之反范式设计之路/合理冗余/去除外键
    WebAPI接口设计:SwaggerUI文档 / 统一响应格式 / 统一异常处理 / 统一权限验证
    开放api接口签名验证
    EasyUI开发踩过的坑(EasyUI开发笔记)
    nuget挂了吗?
    C# 实体/集合差异比较,比较两个实体或集合值是否一样,将实体2的值动态赋值给实体1(名称一样的属性进行赋值)
    从应用的角度讲创业公司该如何选择域名?
    疑似easyui本身bug:easyui时间控件问题,试了几个版本都不行
    工作三年对程序的理解特来求证
    控制器读取视图表单中的数据的几种方式
  • 原文地址:https://www.cnblogs.com/smiler/p/3154019.html
Copyright © 2020-2023  润新知