jQuery MiniUI

标题: 有关父页面、子页面的问题。 [打印本页]

作者: csbabyzhou    时间: 2016-2-25 15:32:07     标题: 有关父页面、子页面的问题。

子页面中,有个grid。从数据库中List一个列表可供勾选。然后有另外一列,设置其“份数”。
这个“份数”是根据数据库动态生成的下拉框 mini-combobox。
它是执行了OnCellBeginEdit(e)的,//编辑前发生   动态添加下拉菜单数据
比如,此时,我勾选了第一条和第三条数据。下拉框也选择了他们的份数。传到父页面。(暂存)
父页面点击“详情”,将刚刚暂存的数据再传给子页面。
此时,勾选动作能够触发(正确选择了第一条和第三条)。但是份数不能触发。
如果解决这个棘手的情况呢?miniui有相关的设置吗?





作者: felt    时间: 2016-2-25 16:27:29

没看明白你的问题,最好提供一个html页面重现
作者: csbabyzhou    时间: 2016-2-26 09:05:52

felt 发表于 2016-2-25 16:27
没看明白你的问题,最好提供一个html页面重现

    像这样,父页面的数据传过来,能勾选,但不能显示出份数。(因为份数的下拉数据是根据点击单元格动态生成的)有什么比较好的解决方案吗?
作者: dforce    时间: 2016-2-26 09:30:54

csbabyzhou 发表于 2016-2-26 09:05
像这样,父页面的数据传过来,能勾选,但不能显示出份数。(因为份数的下拉数据是根据点击单元格动态 ...

还是没看明白你说的东西
请提供具体页面重现
作者: csbabyzhou    时间: 2016-2-29 09:36:55

dforce 发表于 2016-2-26 09:30
还是没看明白你说的东西
请提供具体页面重现

而且有关父页面子页面iframe的问题,ondestroy后,报错:不能执行已释放script的代码。这个怎么解决,网上百度不到。
作者: dforce    时间: 2016-2-29 10:05:23

csbabyzhou 发表于 2016-2-29 09:36
而且有关父页面子页面iframe的问题,ondestroy后,报错:不能执行已释放script的代码。这个怎么解决,网 ...

这个报错一般引起的原因是引用了销毁页面的数据,可以用mini.clone克隆一下再使用
作者: csbabyzhou    时间: 2016-2-29 10:16:41

dforce 发表于 2016-2-29 10:05
这个报错一般引起的原因是引用了销毁页面的数据,可以用mini.clone克隆一下再使用 ...

好的,谢谢!确实可以了。然后就是之前那张图片的问题:有个grid;
列表中有很多条数据。
份数那一列的下拉框是根据某一隐藏列的数据动态生成。比如:隐藏列的某个单元格数据为“1,2,3,4”然后点击所在行份数的那一列:生成下拉框可选项为:1;2;3;4;
OK,传值到父页面一切正常。但是父页面还想打开查看刚刚所选的份数情况就不行。能勾选之前选了的行,但是此行的份数不能显示出来,为什么呢?
作者: dforce    时间: 2016-2-29 10:55:10

csbabyzhou 发表于 2016-2-29 10:16
好的,谢谢!确实可以了。然后就是之前那张图片的问题:有个grid;
列表中有很多条数据。
份数那一列的下 ...

抱歉,无法理解你的场景,请提供页面重现
作者: csbabyzhou    时间: 2016-2-29 14:30:04

dforce 发表于 2016-2-29 10:55
抱歉,无法理解你的场景,请提供页面重现

我已经解决了。input中有valueField和textFiled。值也取到了。然后再次打开,界面不显示东西。但值还是取到的。和displayFiled有关么?如果是,如何用displayFiled 。api中不详细。。
作者: dforce    时间: 2016-2-29 15:06:16

csbabyzhou 发表于 2016-2-29 14:30
我已经解决了。input中有valueField和textFiled。值也取到了。然后再次打开,界面不显示东西。但值还是取 ...

下拉框类编辑器都有值value和文本text,displayField对应文本,如果你的编辑器是下拉框类,必须列上加displayField,数据保存和显示的时候也必须有displayField对应字段的数据
<div field="a" displayField="b"  
        <div property="editor" class="mini-combobox"  valueField="id" textField="text"
例如这样的场景,combobox编辑结束后,比如选中项是{id:1,text:"第一项"},那么最后表格的行数据上会更新成{a:1,b:"第一项".......},这个单元格最后显示的就是”第一项“
作者: csbabyzhou    时间: 2016-3-1 16:51:19


后台数据库(不含份数的字段,为null)传至前台。根据前台暂存的数据复制给num。但是份数不显示(值已经拿到了)




必须像上图那样,点击一下才看到值。有什么办法不点击也能看到值吗?(目前有点像刮刮卡的感觉)
作者: felt    时间: 2016-3-1 17:11:21

csbabyzhou 发表于 2016-3-1 16:51
后台数据库(不含份数的字段,为null)传至前台。根据前台暂存的数据复制给num。但是份数不显示(值已经 ...

如果有问题,请提供重现html,光看你的文字,我无法了解
作者: csbabyzhou    时间: 2016-3-1 17:19:54

felt 发表于 2016-3-1 17:11
如果有问题,请提供重现html,光看你的文字,我无法了解

<body>
        <table align="center" style="width:98%;" cellspacing="13px" class="tabtd">
                <tr>
                        <td width="25%" align="right">保险公司</td>
                        <td width="50%" align="left">
                                <div id="companyName" name="companyName" class="mini-combobox" style="width:40%;" popupWidth="160" textField="COMPANYNAME" valueField="COMPANYNAME" url="khdwxxsbtcxzgs.action" multiSelect="false" showClose="true" onvaluechanged="getValues" required="true">
                                        <div property="columns">
                                                <div header="保险公司名称" field="COMPANYNAME"></div>
                                        </div>
                                </div></td>
                </tr>
        </table>
        <div id="sbtxmxGrid" onlyCheckSelection="true" class="mini-datagrid" url="khdwxxsbtcxzgsmx.action" style="width: 99%;height: 80%;" idField="sid" allowCellEdit="true" allowCellSelect="true" onselect="updateTotal" multiSelect="true" showPager="false" editNextOnEnterKey="true" ondeselect="updateTotal" oncellbeginedit="OnCellBeginEdit" editNextRowCell="true">
                <div property="columns">
                        <div type="indexcolumn" width="5%"></div>
                        <div type="checkcolumn" width="5%" select="alert('1')">&nbsp</div>
                        <div name="bxbh" field="bxbh" headerAlign="center" width="10%">保险编号</div>
                        <div name="sid" field="sid" headerAlign="center" width="10%">SID</div>
                        <div name="bxmc" field="bxmc" headerAlign="center" width="25%">保险名称</div>
                        <div name="bfe" field="bfe" headerAlign="center" width="12%">价格(元 / 份)</div>
                        <div name="num" field="num" id="num" headerAlign="center" width="10%" displayField="num">
                                份数 <input property="editor" class="mini-combobox" required="true" style="width:100%;" valueField="id" textField="text" />
                        </div>
                        <div name="bxsm" field="bxsm" headerAlign="center" width="40%">保险说明</div>
                </div>
        </div>
        <table align="center" style="width:98%;" cellspacing="13px" class="tabtd">
                <tr>
                        <td width="25%" align="left">总计:&nbsp&nbsp <input id="zje" name="zje" class="mini-textbox" readonly width="40%" value="0" /> (元)</td>
                </tr>
        </table>
</body>
<script>
        mini.parse();
        var sbtxmxGrid = mini.get('sbtxmxGrid');
        var companyName = mini.get('companyName');
        sbtxmxGrid.load();
        // 按照选择的单位重置grid数据
        function getValues() {
                sbtxmxGrid.load({
                        companyName : companyName.getValue(),
                });
        }
        // 获得商保套餐明细grid对象
        function getSbtcmxGridData() {
                return mini.get('sbtxmxGrid').getData();
        }
        // 获得总金额
        function getZjeData() {
                return mini.get('zje').getValue();
        }
        //获得主键
        function getSid() {
                var k = mini.get('sbtxmxGrid').getSelecteds().length;
                var m = "";
                for (i = 0; i < k; i++) {
                        m = m + mini.get('sbtxmxGrid').getSelecteds().sid + ";";
                }
                return m;
        }
        //获得份数
        function getFs() {
                var k = mini.get('sbtxmxGrid').getSelecteds().length;
                var m = "";
                for (i = 0; i < k; i++) {
                        m = m + mini.get('sbtxmxGrid').getSelecteds().num + ";";
                }
                return m;
        }

        //获得商保编号及其份数组合
        function getInsuranceDetail() {
                var k = mini.get('sbtxmxGrid').getSelecteds().length;
                var m = "";
                for (i = 0; i < k; i++) {
                        m = m + mini.get('sbtxmxGrid').getSelecteds().bxbh + "*"
                                        + mini.get('sbtxmxGrid').getSelecteds().num + ";";
                }
                return m;
        }
        //获得保险公司名
        function getCompanyName() {
                return mini.get('companyName').getValue();
        }

        // 初始化商保套餐明细grid对象Data
        function setSbtcmxGridData(sgrd) {
                if (sgrd.sid != null) {
                        //跨页面传递的数据对象,克隆后才可以安全使用
                        var data = mini.clone(sgrd);
                        mini.get('companyName').setValue(data.gs);
                        var arrSid = new Array();
                        arrSid = data.sid.split(";");
                        var arrNum = new Array();
                        arrNum = data.num.split(";");
                        sbtxmxGrid.load({
                                companyName : companyName.getValue()
                        }, function() {
                                var rows = mini.get('sbtxmxGrid').getData();
                                for (j = 0; j < rows.length; j++) {
                                        for (k = 0; k < arrSid.length - 1; k++) {
                                                if (rows[j].sid == arrSid[k]) {
                                                        //alert(arrNum[k]);//测试
                                                        rows[j].num = arrNum[k];
                                                        sbtxmxGrid.select(rows[j]);
                                                }
                                        }
                                }
                        });
                }
        }

        // 更新总金额
        function updateTotal() {

                var total = 0;
                mini.get('sbtxmxGrid').commitEdit();
                var rows = mini.get('sbtxmxGrid').getSelecteds();
                for ( var i = 0; i < rows.length; i++) {
                        var row = rows;
                        if (rows.num == null) {
                                mini.alert("请先设置所选保险份数!");
                                deselect(rows);
                        }
                        total = total + row.bfe * row.num;
                }
                mini.get('zje').setValue(total);

        }

        //编辑前发生   动态添加下拉菜单数据      
        function OnCellBeginEdit(e) {
                var grid = e.sender;
                var record = e.record;
                var field = e.field, value = e.value;
                var editor = e.editor;

                //份数        
                if (field == "num") {
                        var tempDataAll = "[";
                        var tempData;
                        var id = record.kxfs;
                        if (id) {
                                var arr = new Array();
                                arr = id.split(",");
                                var i;
                                for (i = 0; i < arr.length; i++) {
                                        tempData = "{id:'" + arr + "',text:'" + arr + "'}";
                                        tempDataAll = tempDataAll + tempData + ",";
                                }
                                if (tempDataAll.lastIndexOf(",") == -1) {
                                        tempDataAll = [];
                                } else {
                                        tempDataAll = tempDataAll.substring(0, tempDataAll
                                                        .lastIndexOf(","))
                                                        + "]";
                                }
                        } else {
                                e.cancel = true;
                        }
                        editor.setData(tempDataAll);
                }
        }
</script>

==================上述为子页面=======================

父页面部分代码:

                                        <div id="sbtcGrid" class="mini-datagrid" style="width: 100%;" idField="id" allowCellEdit="true" allowCellSelect="true" multiSelect="true" showPager="false" editNextOnEnterKey="true" editNextRowCell="true">
                                                <div property="columns">
                                                        <div type="indexcolumn" width="20"></div>
                                                        <div type="checkcolumn" width="20"></div>
                                                        <div name="name" field="name" headerAlign="center" width="15%">
                                                                名称 <input property="editor" class="mini-textbox" required="true" style="width: 100%;" />
                                                        </div>
                                                        <div name="je" field="je" headerAlign="center" width="15%">金额</div>
                                                        <div id="gs" name="gs" field="gs"  visible="true" headerAlign="center" width="15%">公司</div>
                                                        <div id="sid" name="sid" field="sid" visible="true" headerAlign="center" width="15%">SID</div>
                                                        <div id="num" name="num" field="num" visible="true" headerAlign="center" width="15%">份数</div>
                                                        <div id="insuranceDetail" name="insuranceDetail" field="insuranceDetail" headerAlign="center" width="15%">套餐组合简要</div>
                                                        <div name="action" width="120" headerAlign="center" align="center" renderer="onActionRenderer" cellStyle="padding:0;">详细</div>
                                                </div>
                                        </div>



//添加详细按钮
                function onActionRenderer(e) {
                    var grid = e.sender;
                    var record = e.record;
                    var uid = record._uid;
                    var rowIndex = e.rowIndex;
                    var s = "<a href='javascript:sbtcDetail()'>费用详情</a>" ;
                    return s;
                }
                       
                        // 商保套餐详细
                        function sbtcDetail() {
                                mini.open({
                    url: bootPATH + "../../khdwxxsbtcxz.action",
                    title: "选择商保套餐详细", width: 800, height: 500, showModal: false,  
                    onload: function () {
                            var iframe = this.getIFrameEl();
                            var Detail=sbtcGrid.getSelected();
                                    var sbtcDetailGridData={
                                                    "gs"etail.gs,
                                                    "sid"etail.sid,
                                                    "num"etail.num,
                                                    "je"etail.je,
                                    };
                        iframe.contentWindow.setSbtcmxGridData(sbtcDetailGridData);
                        

                        

                    },
                    ondestroy: function (action) {
                            var iframe = this.getIFrameEl();
                            sbtcDetailGridData= iframe.contentWindow.getSbtcmxGridData();
                        var zje = iframe.contentWindow.getZjeData();
                        var companyName=iframe.contentWindow.getCompanyName();
                        var sid=iframe.contentWindow.getSid();
                        var num=iframe.contentWindow.getFs();
                        var insuranceDetail=iframe.contentWindow.getInsuranceDetail();
                        var row = sbtcGrid.getSelected();
                        sbtcGrid.updateRow(row, {"je" : zje});
                        sbtcGrid.updateRow(row, {"gs" : companyName});
                        sbtcGrid.updateRow(row, {"sid" : sid});
                        sbtcGrid.updateRow(row, {"num" : num});
                        sbtcGrid.updateRow(row, {"insuranceDetail" : insuranceDetail});
                    }
                });
                        }
                       
作者: felt    时间: 2016-3-1 17:23:11

csbabyzhou 发表于 2016-3-1 17:19
保险公司
                       
                               

displayField和field请设置不同的字段,更新的时候这2个字段一起更新
作者: csbabyzhou    时间: 2016-3-1 17:25:34

felt 发表于 2016-3-1 17:23
displayField和field请设置不同的字段,更新的时候这2个字段一起更新

照您说的改了,问题依旧,,,已疯。。。
作者: felt    时间: 2016-3-1 17:32:17

csbabyzhou 发表于 2016-3-1 17:25
照您说的改了,问题依旧,,,已疯。。。

grid.updateRow(row,{field1:value1,field2:value2.........
把更新的写一起,同时更新那列的displayField和field不可能显示不出来的




欢迎光临 jQuery MiniUI (http://miniui.com/discuss/) Powered by Discuz! X2