產品添加頁面,須要選擇車型。在bootStrap的modal上彈出子modal來使用。
車型一共有4級目錄。要使用目錄樹。
而後分活動和商品兩種,須要可以經過不通參數來調用該組件。
車型品牌要使用字母導航。html
數據都是後端傳json過來,咱們ajax獲取而後操做。
因爲車型總數據有幾萬條以上,不可能一次性請求過來。這裏咱們使用異步的方式,每點擊一次目錄節點,加載它的下一級。
這裏咱們用兩個參數來控制活動和商品的不一樣加載。_showPrice和opened
後端傳過來的第一級數據是車型品牌,其中有首字母的字段。字母導航的初始化,就是把這個數據用firstWord屬性來排序,而後忽略掉其餘首字母相同的元素。
對於活動類型,須要返回所勾選的最低一級的數據。(勾選奧迪和奧迪A6,則只返回A6的意思),這裏用了整整4層循環。不過它是根據是否有checked來遍歷的,速度不慢。ajax
1 /** 2 * Created by nuenfeng on 2016/5/23. 3 * 車型選擇組件 4 * 參數: 5 * showPrice 是否要輸入價格(不輸入價格的從品牌開始就有選項框,沒有全選功能) 6 * params 外部傳入的對象 7 * callback 回調函數 8 */ 9 (function () { 10 var uriCarBrand = global.url.carBrandList; 11 //var uri = uriCarBrand.url; 12 var opened = false; //當前頁面是否打開過本組件 13 var _callback; //回調函數 14 var requestParams; //請求時要使用的參數 15 var _showPrice; //是否要輸入價格 16 var lastShowPrice; //前一次打開狀態 17 var charNavArr; //字母導航數組 18 19 function CarTree(showPrice, params, callback) { 20 // 沒打開過,初始化; 打開過,直接顯示modal 21 requestParams = params; 22 _showPrice = showPrice; 23 _callback = callback; 24 25 if (!opened || lastShowPrice != showPrice) { 26 this.init(); 27 opened = true; 28 lastShowPrice = showPrice; 29 } else { 30 $('#zc-sub-modal').modal('show'); 31 } 32 } 33 34 CarTree.prototype.init = function () { 35 36 msjcTools.addSubModal(); 37 //設置大模態框 38 $('#zc-sub-modal').addClass("bs-example-modal-lg"); 39 $('#zc-sub-modal .modal-dialog').addClass("modal-lg"); 40 41 var str = '<form id="info-form" data-parsley-validate class="form-horizontal form-label-left">'; 42 str += '<ul id="resourceId" class="treeview-gray">' 43 str += '<li id="cb_0"><span>汽車品牌選擇</span>'; 44 str += "</li>" 45 str += '</ul>' 46 str += '</form>'; 47 48 var objId = 'cb_0'; 49 var carBrandId = 0; 50 loadSubMenu(objId, carBrandId, 1); //1 表示第一次加載,用於加載成功後判斷時候要初始化字母導航 51 52 $('#zc-sub-modal-body').html(str); 53 $('#zc-sub-modal').modal({ 54 keyboard: false, 55 show: true 56 }); 57 58 // 點擊保存事件 59 $('#zc-sub-modal .modal-footer .btn.btn-primary').unbind().bind("click", function () { 60 save(); 61 }); 62 63 64 //$("#resourceId").find("input[type=checkbox]").unbind().bind("click",function(){ 65 // if($(this).is(':checked')==true){//選中 則其上層節點所有展開並選中 66 // //上級選中 67 // $(this).parents("li").each(function(){ 68 // $(this).find("input[type=checkbox]:first").attr("checked",true) 69 // }); 70 // } else { 71 // //下級取消選中 72 // $(this).siblings("ul").find("input[type=checkbox]").each(function(){ 73 // $(this).removeAttr("checked"); 74 // }); 75 // } 76 //}); 77 78 79 //隱藏子窗口後 保持父窗口的滾動 80 $("#zc-sub-modal").on("hidden.bs.modal", function () { 81 $('body').addClass('modal-open') 82 }); 83 } 84 85 CarTree.prototype.empty = function () { 86 opened = false; 87 console.log('empty me'); 88 } 89 90 //加載子菜單 91 var loadSubMenu = function (objId, carBrandId, times) { 92 93 requestParams.brandId = carBrandId; 94 executeAjax(global.url.carBrandList, requestParams, function (data) { 95 // 給data風騷地排個序 96 data.sort(keysrt("firstWord")); 97 98 var menuHtml = "<ul>"; 99 for (var index in data) { 100 var menu = data[index]; 101 menuHtml += '<li id="cb_' + menu.carBrandId + '" value="' + menu.carBrandId + '" brand="' + menu.brand + '">'; 102 103 // 帶價格的樹 104 if (_showPrice) { 105 // 最後一級,添加選項框 106 if (menu.level > 3) { 107 menuHtml += '<input type="checkbox" name="resourceIds" value="' + menu.carBrandId + '" />'; 108 } 109 menuHtml += '<span>' + menu.name + '</span>'; 110 111 // 最後一級,添加輸入框 112 if (menu.level == 4) { 113 menuHtml += '<input type="text" maxlength="9">'; 114 } 115 } else { // 不帶價格的樹 116 menuHtml += '<input type="checkbox" name="resourceIds" value="' + menu.carBrandId + '" />'; 117 menuHtml += '<span>' + menu.name + '</span>'; 118 } 119 120 menuHtml += "</li>"; 121 } 122 menuHtml += "</ul>"; 123 $('#' + objId).append(menuHtml); 124 $('#' + objId).attr('data-load', 'loaded'); 125 126 //汽車類型第一級加載完成後,初始化字符導航 127 charNavArr = []; 128 var fwdLast = ''; //上一次的首字母 129 130 for (var i in data) { 131 var cobjTemp = {}; 132 if (fwdLast != data[i].firstWord) { 133 fwdLast = data[i].firstWord; 134 cobjTemp.firstWord = fwdLast; 135 cobjTemp.targetId = 'cb_'+data[i].carBrandId; 136 charNavArr.push(cobjTemp); 137 } 138 } 139 if (times == 1) { 140 initCharNav(); 141 // 點擊保存事件 142 $('.charNavSaveBtn').unbind().bind("click", function () { 143 save(); 144 }); 145 } 146 }); 147 148 } 149 150 // 此處是風騷的數組對象排序 151 var keysrt = function (propertyName) { 152 return function (object1, object2) { 153 var value1 = object1[propertyName]; 154 var value2 = object2[propertyName]; 155 if (value2 < value1) { 156 return 1; 157 } 158 else if (value2 > value1) { 159 return -1; 160 } 161 else { 162 return 0; 163 } 164 } 165 } 166 167 // 保存事件 168 var save = function(){ 169 // 確認後,執行回調函數 170 if (_showPrice) { 171 var res = getPriceResult(); 172 if (res.status) { 173 _callback(res.data); 174 } else { 175 alert(res.error); 176 return; 177 } 178 } else { 179 _callback(getNopriceResult()); 180 } 181 //返回數據,而後隱藏 182 $('#zc-sub-modal').modal('hide'); 183 } 184 185 // 設置字符導航初始化 186 var initCharNav = function () { 187 var charNavHtml = '<ul id="charNavBar" class="charNavBar pagination">'; 188 for (var i in charNavArr) { 189 charNavHtml += '<li><a href="#'+charNavArr[i].targetId+'">'+charNavArr[i].firstWord+'</a></li>'; 190 } 191 charNavHtml += '<li><a class="modalGoTop">↑</a></li>'; 192 charNavHtml += '<button type="button" class="btn btn-primary charNavSaveBtn">保存</button>'; 193 charNavHtml += '</ul>'; 194 195 $('#zc-sub-modal').append(charNavHtml); 196 197 $('.modalGoTop').on('click', function(e){ 198 $('#zc-sub-modal').animate({scrollTop: 0}, 500); 199 }); 200 } 201 202 // 統計帶價格的返回數據 203 var getPriceResult = function () { 204 var result = { 205 status : true, 206 data : [], 207 error : '' 208 }; 209 var liTemp; 210 var objTemp; 211 $('.treeview-gray input:checkbox:checked').each(function (i) { 212 liTemp = $(this).parent('li'); 213 objTemp = {}; 214 objTemp.carBrandId = liTemp.attr('value'); 215 objTemp.brand = liTemp.attr('brand'); 216 objTemp.carBrandName = liTemp.find('span').text(); 217 objTemp.unitPrice = liTemp.find('input:text').val(); 218 219 // 若是價格沒有輸入,返回保存失敗,並返回沒有輸入的carBrandName 220 if(objTemp.unitPrice == '') { 221 result.status = false; 222 result.error = '請輸入 ' + objTemp.carBrandName + ' 的價格!'; 223 return result; 224 } 225 result.data.push(objTemp); 226 }); 227 return result; 228 } 229 230 // 統計不帶價格的返回數據 231 var getNopriceResult = function () { 232 var result = []; 233 var liTemp; 234 var objTemp; 235 var flag1; 236 var flag2; 237 var flag3; 238 var flag4; 239 var level2Name; 240 241 // 遍歷4層 242 $('#cb_0').children().children('li').children('input:checkbox').each(function (i1) { 243 if ($(this).is(':checked')) { 244 flag1 = true; 245 } else { 246 flag1 = false; 247 } 248 $(this).parent().children().children('li').children('input:checkbox').each(function (i2) { 249 if ($(this).is(':checked')) { 250 flag1 = false; 251 flag2 = true; 252 } else { 253 flag2 = false; 254 } 255 // 獲取第二級的名字,給第三級使用 256 liTemp = $(this).parent('li'); 257 level2Name = liTemp.children('span').text(); 258 $(this).parent().children().children('li').children('input:checkbox').each(function (i3) { 259 if ($(this).is(':checked')) { 260 flag1 = false; 261 flag2 = false; 262 flag3 = true; 263 } else { 264 flag3 = false; 265 } 266 $(this).parent().children().children('li').children('input:checkbox').each(function (i4) { 267 if ($(this).is(':checked')) { 268 flag1 = false; 269 flag2 = false; 270 flag3 = false; 271 flag4 = true; 272 } else { 273 flag4 = false; 274 } 275 if (flag4) { 276 liTemp = $(this).parent('li'); 277 objTemp = {}; 278 objTemp.carBrandId = liTemp.attr('value'); 279 objTemp.brand = liTemp.attr('brand'); 280 //objTemp.carBrandName = liTemp.children('span').text(); 281 objTemp.carBrandName = objTemp.brand + ' ' + liTemp.children('span').text(); 282 result.push(objTemp); 283 } 284 }); 285 if (flag3) { 286 liTemp = $(this).parent('li'); 287 objTemp = {}; 288 objTemp.carBrandId = liTemp.attr('value'); 289 objTemp.brand = liTemp.attr('brand'); 290 //objTemp.carBrandName = liTemp.children('span').text(); 291 objTemp.carBrandName = objTemp.brand + ' ' + level2Name + ' ' + liTemp.children('span').text(); 292 result.push(objTemp); 293 } 294 }); 295 if (flag2) { 296 //liTemp = $(this).parent('li'); 297 objTemp = {}; 298 objTemp.carBrandId = liTemp.attr('value'); 299 objTemp.brand = liTemp.attr('brand'); 300 //objTemp.carBrandName = objTemp.brand + liTemp.children('span').text(); 301 objTemp.carBrandName = objTemp.brand + ' ' + liTemp.children('span').text(); 302 result.push(objTemp); 303 } 304 }); 305 if (flag1) { 306 liTemp = $(this).parent('li'); 307 objTemp = {}; 308 objTemp.carBrandId = liTemp.attr('value'); 309 objTemp.brand = liTemp.attr('brand'); 310 objTemp.carBrandName = liTemp.children('span').text(); 311 result.push(objTemp); 312 } 313 }); 314 315 return result; 316 } 317 318 319 // 給目錄樹綁定點擊事件 320 $(document).on('click', '#resourceId li', function (e) { 321 322 323 e.stopPropagation(); 324 325 if ($(this).attr('open')) { 326 $(this).removeAttr('open'); 327 $(this).children('ul').hide(); 328 } else { 329 $(this).attr('open', 'opened'); 330 $(this).children('ul').show(); 331 } 332 var objId = $(this).attr('id'); 333 var carBrandId = $(this).attr('value'); 334 //加載過的不執行 335 if ($(this).attr('data-load')) { 336 return; 337 } 338 loadSubMenu(objId, carBrandId); 339 }); 340 341 // 點擊多選框時候不下拉 342 $(document).on('click', 'input[type="checkbox"]', function (e) { 343 e.stopPropagation(); 344 }); 345 346 window.CarTree = CarTree; 347 }());
調用方法:json
carTree = new CarTree(false, {}, function (data) { console.log(data); });