当前位置: 首页 > 工具软件 > Dwz_group > 使用案例 >

DWZ(JUI)多层弹窗查找带回实现

东方化
2023-12-01

原功能BUG

DWZ框架的查找带回能不能多层实现呢?查找带回弹窗页面里面再设置几个放大镜触发查找带回功能的弹窗?我一开始以为这样是可以的,如果我在第一层弹窗页面没有点过里面的放大镜,那么第一层页面的数据是可以带回的;但是,如果点击了第二层里的放大镜就无法带回数据。

查找带回的html:

//这是主页面部分,即点击出现查找带回弹窗的源页面
//input里的name属性值(在点之前的部分)是与a标签的lookupgroup属性值对应的,即都是“yourName”
<input readonly="" size="26" name="yourName.name" type="text" value="" class="textInput readonly">
<a class="btnLook" href="XXX" rel="yourName" lookupgroup="yourName" title="XXX"></a>
//input里的name属性值(在点之前的部分)是与a标签的lookupgroup属性值对应的,即都是“yourName”
<input name="yourName.id" type="hidden" value="">

//这是从页面部分,即查找带回弹窗页面

//单选的带回,这里的id和name属性名称是与主页面的两个input里的name属性值(在点之后的部分)是一致的,即input[name='yourName.name']的值是这里的name属性值带回的,input[name='yourName.id']的值是这里的id属性值带回的.
<a class="btnSelect" href="javascript:$.bringBack({id:'xx', name:'xxx'})" title="查找带回">选择</a>

//多选的带回,value属性的值对应关系与上面单选的带回的是一样的。
<input name="bringBacks" value="{id:'xxx', name:'XXX'}" type="checkbox">
//multlookup属性值与input的name属性值一致
<button type="button" multlookup="bringBacks">确定</button>

  • 原因以及解决办法

原因分析:

通过浏览器debug,发现dwz.database.js匿名函数里的_lookup对象的值在点击第二层里的查找功能时,是当前这个查找带回按钮(即放大镜的a标签)设置的相关参数值,然后点击确定触发带回,把值带回来了第一层,但点击第一层的带回功能时,由于_lookup对象的值并没有刷新回第一层查找带回按钮的值,还是第二层查找带回按钮的相关参数值,导致最终第一层的带回无法实现。

如果没有触发过第二层的查找带回,则_lookup对象的值不是刷新为第二层的值,这时是可以实现第一层的带回。原有的功能就是在每次点击任意一个查找带回功能时,触发刷新当前_lookup对象的值,而带回的时候并没有重新刷新该值,导致多层查找带回无法实现。

解决办法:

通过上述的原因分析就可以知道,我们的解决办法当然是让查找带回功能增加带回时,触发刷新_lookup对象的值,让其恢复到上层的查找带回的值。

这其中有三个问题的Q&A:

1.怎么在带回时刷新_lookup对象值? 
参照原来点击查找带回按钮时,触发改变_lookup对象值函数加入到触发带回功能的函数中。

2.怎么知道上层的_lookup对象值? 
给_lookup对象增加上层的标记属性,通过标记获取到上层的_lookup对象值。

3.怎么设置_lookup对象的上层标记属性值? 
在放大镜a标签里自定义标记属性,然后通过JQ的attr方法传值到_lookup对象里。

代码实现:

//在触发第一层查找带回功能的a标签增加标记属性parentRefer,parentRefer值与lookupGroup值一致
<a class="btnLook" href="XXX" parentRefer="firName" rel="XXX" lookupGroup="firName" title="XXX"></a>

//在触发第二层查找带回弹窗的a标签增加标记属性isChild。
<a class="btnLook" href="XXX" isChild="true" rel="XXX" lookupGroup="secName" title="XXX"></a>


//在_lookup对象添加parentRefer和isChild属性来记录和标记其上层查找带回
//parentRefer的值为上层lookupgroup属性值
var _lookup = {currentGroup:"", suffix:"", $target:null, pk:"id",parentRefer:null,isChild:null};

//设置_lookup对象的上层标记属性值
lookup: function(){
        ......
                $this.click(function(event){

                    _lookup = $.extend(_lookup, {
                        currentGroup: $this.attr("lookupGroup") || "",
                        callback: $this.attr("callback")||"",
                        suffix: $this.attr("suffix") || "",
                        $target: $this,
                        pk: $this.attr("lookupPk") || "id",
                        //通过attr函数获取parentRefer值,由上层得来。
                        parentRefer: $this.attr("parentRefer")||_lookup.parentRefer,
                        //通过attr函数获取isChild值,由下层得来。
                        isChild: $this.attr("isChild")||""
                    });
    ......
//增加改变_lookup对象值函数,该函数与lookup函数同级,是参照上述lookup函数写的.
relookup:function(){
            var $this = $(this);
            _lookup = $.extend(_lookup, {
                currentGroup: $this.attr("lookupGroup") || "",
                callback: $this.attr("callback") || "",
                suffix: $this.attr("suffix") || "",
                $target: $this,
                pk: $this.attr("lookupPk") || "id"
            });
        },
//在带回函数中通过判断_lookup的标记属性isChild和parentRefer,来刷新_lookup对象值
$.extend({
        bringBackSuggest: function(args){
            ......
            var isChild=_lookup['isChild']
            if(isChild=="true"){
                if(_lookup['parentRefer']!=null&&_lookup['parentRefer']!='') {
                    //获取触发第一层查找带回功能的a标签,触发刷新_lookup对象值
                    $('a[lookupGroup="'+_lookup['parentRefer']+'"]').relookup();
                }
            }
        },
 类似资料: