zoukankan      html  css  js  c++  java
  • 项目的思考

    1、需求

    从多个comtree批量选择符合条件的选项。

    2、现状

    存在多个comtree,绑定数据的id及text,无批量操作。

     //comtree位置
    @foreach (var info in Model.SubStationInfos) { <div class="form_row"> <div class="form_label"> <label>@info.SubStationName</label> </div> <div> @{ Html.RenderAction("StockMultiple", "Controls", new { subStationSysNo = info.SubStationSysNo, name = "ddl_Stock_" + info.SubStation                          SysNo, selectedValue = info.ReceiptStock }); } </div> </div> //ation   public ViewResult StockMultiple(int subStationSysNo, String name, IEnumerable<int> selectedValue)   {     var stockList = _client.Get<StockFilterResponse>("/Stock");     var stockRelationList = _client.Get<StockRelationFilterResponse>(String.Format("/StockRelation?SubStationSysNo={0}", subStationSysNo));     var query = from obj in stockRelationList.Entities     join stock in stockList.Entities on obj.StockSysNo equals stock.SysNo     select new { id = stock.SysNo, text = HttpUtility.UrlEncode(stock.StockName) };     ViewBag.Json = JsonSerializer.SerializeToString(query, query.GetType());     ViewBag.Name = name;     ViewBag.SelectedValue = selectedValue.Join(",");     return View("Controls/MultipleDropDownList");   } //view <input id="@ViewBag.Name" name="@ViewBag.Name" class="easyui-combotree" panelheight="88" multiple /> <script type="text/javascript" language="javascript"> $(function () { $("#@ViewBag.Name").combotree({ onLoadSuccess: function () { if ($("#@ViewBag.Name").combotree("getValues").length == 0) $("#@ViewBag.Name").combotree('setText', '@Icson.Utility.AppConst.PleaseSelectString'); if ('@ViewBag.SelectedValue' != '') { var arr = $.trim('@ViewBag.SelectedValue').split(','); $("#@ViewBag.Name").combotree('setValues', arr); } }, onHidePanel: function () { if ($("#@ViewBag.Name").combotree("getValues").length == 0) $("#@ViewBag.Name").combotree('setText', '@Icson.Utility.AppConst.PleaseSelectString'); }, onChange: function () { if ($("#@ViewBag.Name").combotree("getValues").length == 0) { $("#@ViewBag.Name").combotree('setText', '@Icson.Utility.AppConst.PleaseSelectString'); $("#@ViewBag.Name").combotree("clear"); } } }); $("#@ViewBag.Name").combotree("loadData", $.parseJSON('@Html.Raw(HttpUtility.UrlDecode((string)ViewBag.Json))')); }) </script>

    3、解决思路

    1)获取数据源,数据源每条记录存在标识属性。

    2)数据转换为json格式返回并绑定到对应的comtree。

    3)根据标识批量勾选符合条件的数据

    4、解决方案

    方案1、对于实现,很自然的想到将数据绑定到comtree,再在前段对comtree进行遍历操作。

    1)该方案问题是每条数据都必须有三个属性需要绑定(id,text,flag),而对于comtree仅能提供id及text绑定,如何将flag也能绑定到对应的选项中是个问题。

    原本打算是将数据id及flag按照某规则合并再绑定到comtree的id属性中(text用于显示),到前段再进行分解,实验许久,发觉会对原有的业务有影响以及操作会变的复杂,无法解决。

    2)不直接使用comtree,自己拼接html组装为comtree,就可以多个赋值,不过本身对于前段技术不大熟悉及时间紧促,想想还是放弃。

    方案2、根据条件在服务端组装好数据再重新绑定到comtree。

    1)使用comtree的reload(查看html元素实际使用iframe)的方法重新加载数据,不过想不出方案设置默认值。

    var url = "/Controls/GetStockMultiple?subStationSysNo=" + subStationSysNo+"&clothesType="+ ctype;
    var stocks=sObj.combotree("reload",url);

    2)服务端将数据源及默认值赋值到json实例,并返回该json实例,前段再通过ajax获取data,再对comtree重新loadData。

      [HttpPost]   
            public JsonResult GetStockMultiple(int subStationSysNo, int clothesType)
            {
                var stockList = _client.Get<StockFilterResponse>("/Stock");
                var stockRelationList = _client.Get<StockRelationFilterResponse>(String.Format("/StockRelation?SubStationSysNo={0}", subStationSysNo));
                var query = from obj in stockRelationList.Entities
                            join stock in stockList.Entities on obj.StockSysNo equals stock.SysNo
                            select new { id = stock.SysNo, text = stock.StockName, isCommonStock = stock.IsCommonStock };
                var selectedValue = new ArrayList();
                foreach (var s in query)
                { 
                    if(s.isCommonStock==clothesType)
                        selectedValue.Add(s.id);
                }
    
                return Json(
                                 new
                                 {
                                     selectedValue = selectedValue,
                                     stocks = query,
                                     status = 0,
                                 }
                            );
            }
    
    
    function selectClothes(ctype)
        {       
            var stockList = $("[id^=ddl_Stock_]");
            for (var i = 0; i < stockList.length; i++) {
                var sObj = stockList.eq(i);
                var index = sObj.attr("id").lastIndexOf('_');
                var subStationSysNo = sObj.attr("id").substring(index + 1);
                var dataObj={subStationSysNo:subStationSysNo, clothesType:ctype};
                $.ajax({
                    url: "/Controls/GetStockMultiple",
                    dataType: "json",
                    contentType: "application/json",
                    type: "POST",
                    async:false,
                    data:  JSON.stringify(dataObj),
                    success: function (data) {
                        if(data.status==0)
                        {
                            sObj.combotree("loadData", data.stocks);
                            if(data.selectedValue.length!=0)
                            {
                                sObj.combotree('setValues', data.selectedValue);
                            }
                            else
                            {
                                sObj.combotree('setText', '@Icson.Utility.AppConst.PleaseSelectString');
                            }
                        }
                    }
                });
            }
            //不提交
            return false;
        }

    注意点:对多个comtree绑定数据,而ajax默认为异步的,所以会导致数据错乱,需要将async属性设置为false,进行同步绑定。

    5、总结

    1、不要钻牛角尖,发现某个方案暂时无法解决问题,换个思路。

    2、多请教别人,在讨论的过程中发现解决方案,有可能别人一句话就能解决,而你需要花几个小时。

    3、多积累,不能只是照搬。

    人总要去积累生活、工作上的点点滴滴,慢慢的进步,以后回头看看,笑笑,顺便学学,人都说回忆才是最美的。
  • 相关阅读:
    Mybatis分页插件PageHelper简单使用
    UUID
    JavaWeb初学者session的使用
    轻松理解AOP思想(面向切面编程)
    DOM操作中,getElementByXXXX 和 querySelector 的区别
    DOM操作中,遍历动态集合的注意事项。ex: elem.children
    微信官方团队放出了UI库,看来以后前端还要学WeChatUI了,哈哈
    jQuery中使用$.each()遍历后台响应的json字符串问题
    平衡树
    后缀数组原理浅析(转载自tqx)
  • 原文地址:https://www.cnblogs.com/jueye/p/3095002.html
Copyright © 2011-2022 走看看