jqGrid增删改查显示——联动下拉框+nodejs后台

来源:互联网 发布:淘宝卖家助手要钱吗? 编辑:程序博客网 时间:2024/05/16 23:37

本篇文章只介绍jqGrid的联动操作,希望能帮到大家~!有不正确的请指出!谢谢!微笑微笑


相关博文:

①jqGrid增删改查显示——显示+nodejs后台:http://blog.csdn.net/tangjiarao/article/details/50454695

在第一篇文章中介绍了jqGrid结合nodejs显示数据,本篇文章在在上篇文章的基础上进行修改。


效果演示:

①增加操作:


②修改操作



可以看到当学校改变的时候,对应的班级都会改变。


实现逻辑:

(1)从后台获取学校的data并且将数据作为下拉框的option

(2)当学校改变时,刷新对应学校的班级

上一篇文章完整核心代码:

$.ajax({//先用ajax与后台交互获取要显示的数据                    url: "/userFindAction",//与后台交互的url                    type: "GET",//ajax提交方式                    dataType: "json",//从服务器端返回的数据类型                    success: function (data) {                        //data是从服务器返回的json对象,其中result是我要显示的数据内容                        window.datas = data.result;                        //设置content-pager高度                        $(".content-pager").height($(window).height() - 400);                        //数据成功拿到后就渲染jqgrid                        // 配置jqGrid的属性                        jQuery("#jqGrid01").jqGrid({                            data: datas,//从服务器拿来的数据                            datatype: "local",//显示数据的方式,因为通过ajax拿到数据了,所以是本地的                            jsonReader: {//描述json 数据格式的数组                                repeatitems: false// 如果设为false,则jqGrid在解析json时,会根据name来搜索对应的数据元素(即可以json中元素可以不按顺序);而所使用的name是来自于colModel中的name设定。                            },                            height: $('.content-pager').height(), // Auto height step 2,                            rowNum: 10,//在grid上初始显示记录条数                            rowList: [10, 20, 30],//一个下拉选择框,用来改变显示记录数                            colNames: ['userId', 'userName', 'accountName', 'accountPassword', 'roleType', 'schoolName', 'schoolClassName', 'active',''],//列显示名称,是一个数组对象                            colModel: [//配置显示的列属性                                /**                                 *  对应后台返回数据datas中的userId                                 *  hidden:控制该列不显示                                 */                                {name: 'userId', index: 'userId', width: 60,hidden:true},                                /**                                *  对应后台返回数据datas中的userName                                *  editable:定义字段是否可编辑                                */                                {                                    name: 'userName',                                    index: 'userName',                                    width: 100,                                    editable: true,                                    editoptions: {size: "20", maxlength: "30"}//当执行修改和新增的操作时,会显示输入框,输入框的配置                                },                                /**                                *  对应后台返回数据datas中的accountName                                *  editable:定义字段是否可编辑                                */                                {                                    name: 'accountName',                                    index: 'accountName',                                    width: 100,                                    editable: true,                                    editoptions: {size: "20", maxlength: "30"}                                },                                /**                                *  对应后台返回数据datas中的accountPassword                                *  search:定义此列是否可以作为搜索列                                *  注:由于不想让用户看到密码,所以将改列的内容改为一个重置按钮,点击可以修改密码                                */                                {                                    name: 'accountPassword',                                    index: 'accountPassword',                                    width: 120,                                    search:false                                },                                /**                                *  对应后台返回数据datas中的roleType                                *  editrules:设置编辑字段的控件的规则                                *  edittype:控件该字段在修改或者新增时类型 select为下拉菜单                                */                                {                                    name: 'roleType',                                    index: 'roleType',                                    width: 80,                                    editable: true,                                    editrules: true,                                    edittype: "select",                                },                                /**                                *  对应后台返回数据datas中的schoolName                                */                                {                                    name: 'schoolName',                                    index: 'schoolName',                                    width: 150,                                    editable: true,                                    editrules: true,                                    edittype: "select",                                },                                /**                                *  对应后台返回数据datas中的schoolClassName                                *  value:在修改或者新增时下拉框显示的数据                                */                                {                                    name: 'schoolClassName',                                    index: 'schoolClassName',                                    width: 150,                                    editable: true,                                    edittype: "select",                                    editoptions: {value: {'请选择班级': '请选择班级'}}                                },                                /**                                *  该字段是在前端自定义的字段                                *  sortable:设置该字段是否进行排序                                */                                {                                    name: 'active', index: 'active', width: 60,sortable : false                                },                                /**                                *  改列显示编辑、保存、重置按钮,在编辑操作会用到                                */                                {                                    name : 'act',index : 'act',width : 75,sortable : false,search:false                                },                            ],                            pager: "#jqGridPager01",//定义翻页用的导航栏,必须是有效的html元素(即定义的div块)。                            viewrecords: true,//定义是否要显示总记录数                            caption: "User Management",//表格名称                            hidegrid: false,//启用或者禁用控制表格显示、隐藏的按钮,只有当caption 属性不为空时起效                            multiselect: true,//定义是否可以多选                            altRows: true,                            rownumbers: true,//如果为ture则会在表格左边新增一列,显示行顺序号                            /**                             *   当从服务器返回响应时执行的方法                             *   ----我的理解是加载表格完成后执行的方法----                             */                            loadComplete: function () {                                //设置Reset按钮                                setReset();                                //设置最后一列的修改按钮                                setEdit();                            },                        });                        // 配置导航条属性                        jQuery("#jqGrid01").navGrid('#jqGridPager01', {                            //设置为false需要自己重新重新该方法                            edit: false,                            add: false,                            del: false,                            search: true                        },{},{},{},{multipleSearch:true})                                /**                                 *  增加自定义按钮——add按钮                                 *  参数1:导航条div名称                                 *  参数2:按钮名称,可以为空                                 *  参数3:按钮的图标,string类型,必须为jquery UI theme图标                                 *  onClickButton:点击该按钮时候的操作                                 */                                .navButtonAdd('#jqGridPager01', {                                    caption: "", buttonicon: "ui-icon-circle-plus", onClickButton: function () {                                        //增加一行操作                                        addRows();                                    },                                    position: "first"//first或者last,按钮位置                                })                                .navButtonAdd('#jqGridPager01', {                                    caption: "", buttonicon: "ui-icon-trash", onClickButton: function () {                                        //删除一行操作                                        removeRows();                                    },                                    position: "first"                                })                                //分隔符                                .navSeparatorAdd("#jqGridPager01", {sepclass: "ui-separator", sepcontent: ''});                        $("#jqGrid01").jqGrid('setGridWidth', $(".content-pager").width(), true);                    },                    error: function () {                    }                }        );    });

(1)从后台获取学校的data

当table加载完之后就与后台服务器进行交互,所以在loadComplete方法中调用getSchool();

loadComplete: function () {                     //获取学校data                      getSchool();                                                     //设置Reset按钮                      setReset();                     //设置最后一列的修改按钮                     setEdit();},
getSchool()方法
/**     * get School List     */    function getSchool(){        $.ajax({//用ajax与后台交互            url: '/schoolFindExistFindAction',//后台请求url            async: false,            success: function (data) {                if (data.success == 1) {//如果返回成功                    window.schoolResult = data.result;//拿出学校data                    var schoolName = "请选择学校:请选择学校;";                    //将数据里面的schoolName逐个取出,并且以”xxxx:xxxx“设置为select的option值,连接成String对象                    for (var i = 0; i < schoolResult.length; i++) {                        if(i!=schoolResult.length-1){                            schoolName+=schoolResult[i].schoolName+":"+schoolResult[i].schoolName+";";                        }else{                            schoolName+=schoolResult[i].schoolName+":"+schoolResult[i].schoolName;                        }                    }                    //alert(JSON.stringify(schoolName));                    /**                     * 设置新的属性,动态改变列属性                     * schoolName:是点击add按钮后,弹出表单(即上图)中schoolName字段的id值,其是按照你定义的列名产生的。                     *                      * 调用该方法后,school的下拉菜单就会有学校名称                     */                    $('#jqGrid01').setColProp('schoolName', {editoptions: {value: schoolName}});                }            }        });    }
node.js
router.get('/schoolFindExistFindAction',schoolManagermentController.schoolFindExistFindAction());
schoolManagermentController
/** * get school List where the school have at least one schoolClass * @returns {Function} */exports.schoolFindExistFindAction = function() {    return function(req, res) {        schoolClassDao.distinctSchoolClass('schoolId',{},dbHelper,function(result){            if(result.success==1){                var conditions ={_id:{"$in": result.result}};                schoolDao.findSchool(conditions,dbHelper,function(result){                    if(result.success==1){                        var schoolGroup=result.result;                        var schoolGroupNew =new Array();                        for(var i=0;i<schoolGroup.length;i++){                            schoolGroupNew.push({                                id:i+1,                                schoolId:schoolGroup[i]._id,                                schoolName:schoolGroup[i].schoolName                            });                        }                        res.json({success:1,flag:"find School exist success",result:schoolGroupNew});                    }                });            }        });    }}
其中后台代码不解释了,因为都是我的逻辑,大家按照自己的逻辑去写,用res.json返回数据
(2)当学校改变时,刷新对应学校的班级
由于当学校改变的时候,需要有以下动作:
1.向服务器提交选中的school
2.服务器通过school查找对应班级并且返回
3.schoolClass下拉框的option重新刷新
所以要给school增加改变时的触发方法

<span style="white-space:pre"></span>/**                                *  对应后台返回数据datas中的schoolName                                */                                {                                    name: 'schoolName',                                    index: 'schoolName',                                    width: 150,                                    editable: true,                                    editrules: true,                                    edittype: "select",                                    editoptions: {                                        dataEvents: [//给当前控件追加事件处理                                            {                                                type: 'change',                 //下拉选择的时候                                                fn: function (e) {              //触发方法                                                    //获取当前下拉框的id名字(这是点击编辑按钮时才需要的,因为点击编辑按钮后,schoolName的下拉框会变成1_schoolName,其中”1“是行号)                                                    var itemName = this.id;                                                         var selectNum = itemName.match(/^\d+/);//(这是点击编辑按钮时才需要的)将id中的数字获取出来                                                    var schoolName =this.value; //获取选中的学校名称                                                    getSchoolClass(selectNum,schoolName); //调用获取班级data的方法                                                }                                            }                                        ]                                    }                                },
getSchoolClass(selectNum,schoolName);方法
/**     *  获取班级列表     */    function getSchoolClass(selectNum, schoolName) {        var str = ""; //用来存放option值        //将增加操作的弹出菜单中的schoolClassName的下拉框内容清空(因为每次切换内容都需要变更)        $("select#schoolClassName").empty();        //将修改操作中的1_schoolClassName(1是行号)的下拉框内容清空(因为每次切换内容都需要变更)        $("select#" + selectNum + "_schoolClassName").empty();        if (schoolName == '请选择学校') {            str += "<option>" + "请选择班级" + "</option>";        }        else {            var schoolId;            for (var i = 0; i < schoolResult.length; i++) {                //通过与本地学校data的匹对,获取学校的id                if (schoolName.toString() == schoolResult[i].schoolName) {                    schoolId = schoolResult[i].schoolId;                    //与后台进行操作                    $.ajax({                        url: '/schoolClassFindAction',                        async: false,                        cache: false,                        dataType: "json",                        data: {                            schoolId: schoolId,  //传入学校id,到后台获取json                            schoolClassName: ""                        },                        success: function (result) {                            // alert(JSON.stringify(result));                            if (result.success == 1) {                                                                var schoolClass = result.result;   //取出班级data                                for (var i = 0; i < schoolClass.length; i++) {   //循环生成option,并且连接成String对象                                    str += "<option schoolid='" + schoolClass[i].schoolClassId + "' value='" + schoolClass[i].schoolClassName + "'>" + schoolClass[i].schoolClassName + "</option>";                                    //alert(str);                                }                            }                            else {                                str += "<option>" + "暂无班级" + "</option>";                            }                        }                    });                    break;                }            }        }        //获取下面下拉框schoolClassName对象        var schoolClassName = $("select#schoolClassName");           schoolClassName.append(str);//渲染option                //获取下面下拉框selectNum_schoolClassName对象        var schoolClassName2 = $("select#" + selectNum + "_schoolClassName");           schoolClassName2.append(str);//渲染option    }

再次说明:
弹出菜单的下拉联动,shcoolName后的下拉框id是schoolName,其是jqgrid调用增加操作方法时按照列名产生的,所以在联动操作时对该列进行改变进行监听,并且改变schoolClassName的option值。
增加操作:
列编辑的下拉联动,schoolName的下拉框id是1_schoolName,2_schoolName……等,数字是行id,所以对某行操作时需要用正则表达式将id中数字取出,再对对应的下拉框进行操作。
修改操作:



相关文章:

http://blog.csdn.net/tangjiarao/article/details/50460146  增加
http://blog.csdn.net/tangjiarao/article/details/50460780  修改
http://blog.csdn.net/tangjiarao/article/details/50461122  删除
http://blog.csdn.net/tangjiarao/article/details/50461998  查找


参考文章:

http://www.cnblogs.com/sikaodelang/articles/2513299.html
http://jingyan.baidu.com/article/08b6a591ce02f214a809220d.html 

0 0
原创粉丝点击