dwz tips

 

DWZ (JUI) 教程 navTabPageBreak 流程分析


(原文地址:http://blog.csdn.net/jiweigang1/article/details/7519781)
前一阵子有朋友问道 navTabPageBreak 查询参数无法传递的问题,只有一张图片,我很难找到具体原因,在这里我把整个流程分析一下,这样自己找找问题所在, 也希望能给其他的朋友带来帮助。

我以表格控件的 分页显示数量为例。dwz-ria-1.4.3

先说一下流程

    

   

  

  1 分页的Combox控件的 onchange事件 触发 navTabPageBreak

  2 navTabPageBreak 实质上是调用的 dwzPageBreak 方法

  这里我就重点说明一下dwzPageBreak方法


 [html] view plaincopy

  1. /**  
  2.  * 处理navTab中的分页和排序  
  3.  * @param args {pageNum:"n", numPerPage:"n", orderField:"xxx", orderDirection:""}  
  4.  * @param rel: 可选 用于局部刷新div id号  
  5.  */  
  6. function navTabPageBreak(args, rel){  
  7.         //实质上调用的 dwzPageBreak 方法,dwzPageBreak 是对navTab和dialog通用一个方法  
  8.     dwzPageBreak({targetType:"navTab", rel:rel, data:args});  
  9. }  
  10.   
  11. /**  
  12.  * 处理navTab中的分页和排序  
  13.  * targetType: navTab 或 dialog  
  14.  * rel: 可选 用于局部刷新div id号  
  15.  * data: pagerForm参数 {pageNum:"n", numPerPage:"n", orderField:"xxx", orderDirection:""}  
  16.  * callback: 加载完成回调函数  
  17.  */  
  18.   
  19.  //这个方法是重点  
  20.  function dwzPageBreak(options){  
  21.         //这里设置一些默认是属性  
  22.     var op = $.extend({ targetType:"navTab", rel:"", data:{pageNum:"", numPerPage:"", orderField:"", orderDirection:""}, callback:null}, options);  
  23.         //获取默认的父容器,一般就是当前的dialog和当的navTab  
  24.         var $parent = op.targetType == "dialog" ? $.pdialog.getCurrent() : navTab.getCurrentPanel();  
  25.         //这里是局部的刷新, 流程就是通过Ajax请求获取到新的html片段,替换掉 指定的id (op.rel)节点,然后从新格式化布局。  
  26.     if (op.rel) {  
  27.         var $box = $parent.find("#" + op.rel);  
  28.                 //获取当前页面的查询form 下面会重点讲解  
  29.         var form = _getPagerForm($box, op.data);  
  30.         if (form) {  
  31.                         //获取新的html片段,替换掉原始的。  
  32.             $box.ajaxUrl({         //获取查询表单里参数,所以刷新页面时表表单数据是一并发过去的   
  33.                 type:"POST", url:$(form).attr("action"), data: $(form).serializeArray(), callback:function(){  
  34.                          //重新格式化布局  
  35.                     $box.find("[layoutH]").layoutH();  
  36.                 }  
  37.             });  
  38.         }  
  39.          //刷新整个 navTab、或者 dialog  
  40.          } else {  
  41.              //获取当前页面的查询form 下面会重点讲解  
  42.              var form = _getPagerForm($parent, op.data);  
  43.               
  44.             //获取查询表单里参数,所以刷新页面时表表单数据是一并发过去的   
  45.             var params = $(form).serializeArray();  
  46.             //通过各个reload方法可以刷新  
  47.             if (op.targetType == "dialog") {  
  48.                 if (form) $.pdialog.reload($(form).attr("action"), {data: params, callback: op.callback});  
  49.             }else{  
  50.                if (form)  navTab.reload($(form).attr("action"), {data: params, callback: op.callback});  
  51.             }  
  52.          }  
  53. }  
  54.   
  55. /**  
  56.  *   
  57.  * @param {Object} args {pageNum:"",numPerPage:"",orderField:"",orderDirection:""}  
  58.  * @param String formId 分页表单选择器,非必填项默认值是 "pagerForm"  
  59.  */  
  60.   
  61. //dwzPageBreak 方法调用这个方法   
  62. function _getPagerForm($parent, args) {  
  63.          //获取当前页面下查询Form节点  
  64.          //#pagerForm Id 名字很重要 如果传递不了参数,可以检查一下 ID 名称         
  65.         var form = $("#pagerForm", $parent).get(0);  
  66.     if (form) {  
  67.                 //在这里会把你传递的参数附上。  
  68.         if (args["pageNum"]) form[DWZ.pageInfo.pageNum].value = args["pageNum"];  
  69.                 //<select class="" onchange="navTabPageBreak({numPerPage:this.value})" name="numPerPage">   
  70.                 //在这里附上值,从而达到你切换数量时刷新页面的效果  
  71.         if (args["numPerPage"]) form[DWZ.pageInfo.numPerPage].value = args["numPerPage"];  
  72.         if (args["orderField"]) form[DWZ.pageInfo.orderField].value = args["orderField"];  
  73.         if (args["orderDirection"] && form[DWZ.pageInfo.orderDirection]) form[DWZ.pageInfo.orderDirection].value = args["orderDirection"];  
  74.     }  
  75.       
  76.     return form;  
  77. }  

WZ下ajax后台交互后的分页刷新

2013-5-1阅读1747 评论1

之前做的几个项目,用上了DWZ这个UI框架作为管理后台的界面,觉得还是不错的。个人觉得有点遗憾的是这个框架的整体感觉不够企业化,缺少稳重的感觉。
在开发过程中,碰到了一些问题,这里跟大家分享一下。
 
 DWZ版本: DWZ RIA 1.3 Final
说明:因为之前做过一些自定义,是直接将 dwz.min.js 改成 dwz.newgxu.js ,这样做对整个框架修改过大,造成以后更新与维护的各种不便。所以,现在作的修改是以覆盖的方式进行。
 
问题描述:
在一些分页的NAV中,进行 ajaxToDo 或者 弹出Dialog的validateCallback 后,服务器返回的json为:
{"statusCode":"200", "message":"权限删除成功", "navTabId":"permission_list","rel":"", "callbackType":"","forwardUrl":"permission/list"}
这里,会将整个NAV刷新,但我们想要的只是刷新当前页。
 
下面就这个问题作一些修正。
 
首先说一下DWZ与后台交与的形式:
 
1. 通过 <a target="ajaxToDo" href="http://m.cnblogs.com/164131/"></a>
这里点击这个标签会向后台post请求,地址就是 href 的值,ajax的回调函数默认是  navTabAjaxDone
 
2. 通过 target="dialog"
如增加一个新用户,以dialog的方式弹出输入界面,这样写:
<a class="BUTTON" href="user/add" width="300" height="250" target="dialog"
rel="rank_create" fresh="false">添加用户</a>
 
弹出内容:
<form name="form1" method="post" action="user/add"  onsubmit=
"return validateCallback(this, dialogAjaxDone);"></form>
 
提交这个表单后,回调函数为 dialogAjaxDone。
 
 
再说说DWZ分页的实现:
 
<div class="pageHeader RIGHT">
    <form id="pagerForm" name="permission_list_pageForm" style="display:none;"
action="permission/list" method="get" onsubmit="returnnavTabSearch(this);">
        <input type="hidden" name="page" value="${model.page}"/>    
    </form>
</div>
<div class="pageContent">
    <table class="table" width="100%"  border="1" layoutH="85" align="center"
cellspacing="0" bordercolor="#999999" style="border-collapse:collapse">
        <thead>
            <tr>
                <th width="3%">ID</th>
                <th width="6%">应用名称</th>
                <th width="10%">名称</th>
                <th width="8%">模块名</th>
                <th width="8%">方法名</th>
                <th width="30%">说明</th>
                <th width="8%">添加人</th>
                <th width="15%">添加时间</th>
                <th width="10%">操作</th>
            </tr>
        </thead>
    </table>
   
    <div class="panelBar">
        <div class="pages">
            <span>共${model.totalCount}条</span>
        </div>
        <div class="pagination" targetType="navTab" totalCount=
"${model.totalCount}" numPerPage="${model.pageSize}"
pageNumShown="16" currentPage="${model.page}"></div>
    </div>
</div>
 
说明:
可以按照上面的div分层格式写,id="pagerForm" 这个一定需要。
 
 
好了,现在开始实现刷新当前分页。先作一些准备工作:
给id="pagerForm" 增加一个唯一的名称,格式:当前{navTabId}_pageForm。
在这个Form中的 name="page" 给一个值,这个值就是当前的页码,这样方便分页刷新。
 
 
然后将下面两个方法加入到 总的页面中,一般是 加载dwz框架的页面,如index.html:
 
    /**
     * 弹出窗口编辑提交后,异步处理函数,在这里会刷新当前的分页table的值
     *
     * 思路:
          手动提交 pagerForm 这个表单
     *
     * 确保 id=pagerForm  的表单存在,参考:
     * ====================================================================================
     * <form id="pagerForm" style="display:none;"
     *             action="permission/list" method="get" οnsubmit="return navTabSearch(this);">
     *        <input type="hidden" name="page" value="1" /><!--【必须】value=1可以写死-->
     * </form>
     * ------------------------------------------------------------------------------------
     * 修改action为相应的地址即可
     * ====================================================================================
     *
     * 3.修改弹出的dialog回调函数的声明:
     *     <form name="form1" method="post" action="permission/add" 
     *         οnsubmit="return validateCallback(this, dialogAjaxDone_fresh);">
     *
     *  将原来的 dialogAjaxDone 改成下面的函数名即可。
     *
     * @param {Object} json
     */
    function dialogAjaxDone_fresh(json){
        DWZ.ajaxDone(json);
        if(json.statusCode==DWZ.statusCode.ok){
            $("form[name="+json.navTabId+"_pageForm]").submit();
            $.pdialog.closeCurrent();
        }
    }
   
    /**
     * 重写 navTabAjaxDone方法
     *
     * @param {Object} json
     */
    function navTabAjaxDone(json){
        DWZ.ajaxDone(json);
        if(json.statusCode==DWZ.statusCode.ok){
            if(json.navTabId){
                //先判断当前的nav是否有 pagerForm,
                //有,就刷新这个nav 中的分页控件
                var $pageForm = $("form[name="+json.navTabId+"_pageForm]");
                if($pageForm){
                    console.log("刷新分页");
                    $pageForm.submit();
                }else{
                    console.log("刷新本Nav");
                    navTab.reloadFlag(json.navTabId);
                }
            }else{
                navTabPageBreak({},json.rel);
            }
            if("closeCurrent"==json.callbackType){
                setTimeout(function(){navTab.closeCurrentTab();},100);
            }else if("forward"==json.callbackType){
                navTab.reload(json.forwardUrl);
            }
        }
    }
 
 
然后修改dialog中的回调函数 为我们的新加的函数:
<form name="form1" method="post" action="user/add"  onsubmit="return
validateCallback(this, dialogAjaxDone_fresh);"></form>
 
 
对于 ajaxToDo 形式的交互,不需要修改。
 
至此,完成。

--------------------------------------------------------------------------------------------------------------------
navTabAjaxDone函数的简要注释

/**
 * navTabAjaxDone是DWZ框架中预定义的表单提交回调函数.
 * 服务器转回navTabId可以把那个navTab标记为reloadFlag=1, 下次切换到那个navTab时会重新载入内容. 
 * callbackType如果是closeCurrent就会关闭当前tab
 * 只有callbackType="forward"时需要forwardUrl值
 * navTabAjaxDone这个回调函数基本可以通用了,如果还有特殊需要也可以自定义回调函数.
 * 如果表单提交只提示操作是否成功, 就可以不指定回调函数. 框架会默认调用DWZ.ajaxDone()
 * <form action="/user.do?method=save" οnsubmit="return validateCallback(this, navTabAjaxDone)">
 * 
 * form提交后返回json数据结构statusCode=DWZ.statusCode.ok表示操作成功, 做页面跳转等操作. statusCode=DWZ.statusCode.error表示操作失败, 提示错误原因. 
 * statusCode=DWZ.statusCode.timeout表示session超时,下次点击时跳转到DWZ.loginUrl
 * {"statusCode":"200", "message":"操作成功", "navTabId":"navNewsLi", "forwardUrl":"", "callbackType":"closeCurrent", "rel"."xxxId"}
 * {"statusCode":"300", "message":"操作失败"}
 * {"statusCode":"301", "message":"会话超时"}
 */
function navTabAjaxDone(json)
{
DWZ.ajaxDone(json);
if (json[DWZ.keys.statusCode] == DWZ.statusCode.ok)
{
if (json.navTabId)
{ //把指定navTab页面标记为需要“重新载入”。注意navTabId不能是当前navTab页面的
navTab.reloadFlag(json.navTabId);

//就像上面的一个文章中所说的,一个常常希望的功能就是,新打开的页面编辑完成后,
//列表页面也会刷新,但是这里reloadFlag方式设置重新载入会跳回初始界面,不会刷新
//当前页列表.
//下面的else分支中,会刷新当前分页的列表。但是在这里调用navTabPageBreak也不能
//实现,因为navTabPageBreak的代码里还是会调用getCurrentPanel。

else 
{ //重新载入当前navTab页面
var $pagerForm = $("#pagerForm", navTab.getCurrentPanel());
var args = $pagerForm.size()>0 ? $pagerForm.serializeArray() : {}
navTabPageBreak(args, json.rel);

//返回的json中如果木有指定navTabId,就会走上面这个esle分支,navTabPageBreak中,重新获取
//当前页面上的form然后提交,能够保证刷新后停留在当前页面上。
}


if ("closeCurrent" == json.callbackType) 
{
setTimeout(function(){navTab.closeCurrentTab(json.navTabId);}, 100);

else if ("forward" == json.callbackType) 
{
navTab.reload(json.forwardUrl);

else if ("forwardConfirm" == json.callbackType) 
{
alertMsg.confirm(json.confirmMsg || DWZ.msg("forwardConfirmMsg"), 
{
okCall: function()
{
navTab.reload(json.forwardUrl);
},
cancelCall: function()
{
navTab.closeCurrentTab(json.navTabId);
}
});

else 
{
navTab.getCurrentPanel().find(":input[initValue]").each(function()
{
var initVal = $(this).attr("initValue");
$(this).val(initVal);
});
}
}
}
//至少从这个函数里,看不出来应该怎样的简便的实现记住查询条件的刷新列表页。
//上面文章里的方法又太麻烦。一个简单的近似方法是:

深度学习是机器学习的一个子领域,它基于人工神经网络的研究,特别是利用多层次的神经网络来进行学习和模式识别。深度学习模型能够学习数据的高层次特征,这些特征对于图像和语音识别、自然语言处理、医学图像分析等应用至关重要。以下是深度学习的一些关键概念和组成部分: 1. **神经网络(Neural Networks)**:深度学习的基础是人工神经网络,它是由多个层组成的网络结构,包括输入层、隐藏层和输出层。每个层由多个神经元组成,神经元之间通过权重连接。 2. **前馈神经网络(Feedforward Neural Networks)**:这是最常见的神经网络类型,信息从输入层流向隐藏层,最终到达输出层。 3. **卷积神经网络(Convolutional Neural Networks, CNNs)**:这种网络特别适合处理具有网格结构的数据,如图像。它们使用卷积层来提取图像的特征。 4. **循环神经网络(Recurrent Neural Networks, RNNs)**:这种网络能够处理序列数据,如时间序列或自然语言,因为它们具有记忆功能,能够捕捉数据中的时间依赖性。 5. **长短期记忆网络(Long Short-Term Memory, LSTM)**:LSTM 是一种特殊的 RNN,它能够学习长期依赖关系,非常适合复杂的序列预测任务。 6. **生成对抗网络(Generative Adversarial Networks, GANs)**:由两个网络组成,一个生成器和一个判别器,它们相互竞争,生成器生成数据,判别器评估数据的真实性。 7. **深度学习框架**:如 TensorFlow、Keras、PyTorch 等,这些框架提供了构建、训练和部署深度学习模型的工具和库。 8. **激活函数(Activation Functions)**:如 ReLU、Sigmoid、Tanh 等,它们在神经网络中用于添加非线性,使得网络能够学习复杂的函数。 9. **损失函数(Loss Functions)**:用于评估模型的预测与真实值之间的差异,常见的损失函数包括均方误差(MSE)、交叉熵(Cross-Entropy)等。 10. **优化算法(Optimization Algorithms)**:如梯度下降(Gradient Descent)、随机梯度下降(SGD)、Adam 等,用于更新网络权重,以最小化损失函数。 11. **正则化(Regularization)**:技术如 Dropout、L1/L2 正则化等,用于防止模型过拟合。 12. **迁移学习(Transfer Learning)**:利用在一个任务上训练好的模型来提高另一个相关任务的性能。 深度学习在许多领域都取得了显著的成就,但它也面临着一些挑战,如对大量数据的依赖、模型的解释性差、计算资源消耗大等。研究人员正在不断探索新的方法来解决这些问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值