Apicloud——底部城市选择器,二级联动选择,截取数组数据
2018-12-06 08:56:39
需求:
根据城市—》选择对应城市门店
情况写法:
结合mui的选择器插件
遇到的问题:
因为其中城市数据是后台获取,需要其中的城市id去选择相关城市的门店,实现二级联动选择,apicloud内部插件使用的是json文件固定数据,不太好用;
选择了mui的picker选择器,但是使用的json数据格式是固定的,不然不显示数据,
其解决方案:使用replace改变数据的key名,就符合了它的数据格式;
剩下的问题是:
mui的插件放在ajax回调函数中,会出现多次加载弹窗的情况,
解决方法:
把选择器自执行方法体放在ajax外面,获取的数据放在ajax回调函数里面;
1 <!doctype html> 2 <html> 3 4 <head> 5 <meta charset="utf-8"> 6 <meta name="viewport" content="maximum-scale=1.0,minimum-scale=1.0,user-scalable=0,width=device-width,initial-scale=1.0" /> 7 <title>APICloud APP</title> 8 <link rel="stylesheet" type="text/css" href="../css/api.css" /> 9 <link rel="stylesheet" type="text/css" href="../css/style.css" /> 10 <!-- <link rel="stylesheet" type="text/css" href="../css/mui.min.css" /> --> 11 <link rel="stylesheet" type="text/css" href="../css/mui.picker.min.css" /> 12 <link rel="stylesheet" type="text/css" href="../css/mui.poppicker.css" /> 13 <style> 14 .vehicle_set { 15 margin-right: 10px; 16 } 17 18 input { 19 border: 0px; 20 outline: none; 21 cursor: pointer; 22 background-color: transparent; 23 } 24 25 .work { 26 height: 99%; 27 display: flex; 28 align-items: center; 29 /*margin-right: 5px;*/ 30 } 31 32 .yuyue { 33 margin-top: 10px; 34 height: 45px; 35 line-height: 45px; 36 } 37 </style> 38 39 </head> 40 41 <body> 42 <header class="buy_car_wrap" onclick="closeWin()"> 43 <span class="buy_car_arrowl"></span> 我要买车 44 </header> 45 <div class="h10"></div> 46 <section> 47 <!-- 车辆款式 --> 48 <div class="vehicle_type "> 49 <div class="vehicle_type_set">车辆款式</div> 50 <input type="text" placeholder="请输入车款" class="vehicle_set"> 51 <div class="vehicle_type_left"></div> 52 </div> 53 <div class="vehicle_type "> 54 <div class="vehicle_type_set">购车城市</div> 55 <input type="text" placeholder="去选择" readonly class="vehicle_set" id="showCityPicker"> 56 <div class="vehicle_type_left"></div> 57 </div> 58 <div class="vehicle_type "> 59 <div class="vehicle_type_set">车辆价格</div> 60 <input type="text" placeholder="请输入金额" class="vehicle_set"> 61 <div class="work">万元</div> 62 </div> 63 <div class="vehicle_type "> 64 <div class="vehicle_type_set">车辆类别</div> 65 <input type="text" placeholder="去选择" class="vehicle_set"> 66 <div class="vehicle_type_left"></div> 67 </div> 68 <div class="vehicle_type " > 69 <div class="vehicle_type_set">选择门店</div> 70 <input type="text" placeholder="去选择" readonly class="vehicle_set" onclick="choose_store()" id="choose_store"> 71 <div class="vehicle_type_left"></div> 72 </div> 73 <div class="vehicle_type "> 74 <div class="vehicle_type_set">行驶里程</div> 75 <input type="text" placeholder="计入里程数" class="vehicle_set"> 76 <div class="work">公里</div> 77 </div> 78 79 <div class="buy_car_wrap yuyue">立即预约</div> 80 81 </section> 82 83 <section class="car_leibie" id="car_leibie"> 84 <div>新车</div> 85 <div>二手车</div> 86 <div>取消</div> 87 </section> 88 89 </body> 90 <script type="text/javascript" src="../script/api.js"></script> 91 <script type="text/javascript" src="../script/mui.min.js"></script> 92 <script type="text/javascript" src="../script/mui.picker.min.js"></script> 93 <script type="text/javascript" src="../script/mui.poppicker.js"></script> 94 <!-- <script type="text/javascript" src="../script/cook.js"></script> --> 95 <!-- <script type="text/javascript" src="../script/city.data-3.js"></script> --> 96 <script type="text/javascript" src="../script/jquery.js"></script> 97 <script type="text/javascript"> 98 //var ss = ""; 99 // window.citys=''; 100 101 var citys; 102 apiready = function() { 103 // var citys; 104 api.ajax({ 105 url: 'http://xxxxx.xxxxxx.cn/index/index/getAllCity', 106 method: 'post', 107 data: {} 108 }, 109 function(ret, err) { 110 if (ret) { 111 //console.log(JSON.stringify(ret)); 112 var city = ret.data.city; 113 var qwe = JSON.stringify(city).replace(/id/g, "value").replace(/name/g, "text").replace(/},\"c\"/g, ",\"children\"").replace(/{\"p\":{/g, "{"); 114 ss = JSON.parse(qwe); 115 //console.log(JSON.stringify(ss)); 116 var city_ids = []; 117 for (var i = 0; i < ss.length; i++) { 118 //console.log(JSON.stringify(ss[i].children)); 119 var id = ss[i].children; 120 for (var j = 0; j < id.length; j++) { 121 //console.log(JSON.stringify(id[j].value)); 122 city_ids = id[j].value; 123 } 124 125 } 126 //console.log(JSON.stringify(city_ids)); 127 128 //获取城市 129 //var citys; 130 (function($, doc) { 131 $.init(); 132 $.ready(function() { 133 var cityPicker = new $.PopPicker({ 134 layer: 2 135 }); 136 cityPicker.setData(ss); 137 var showCityPickerButton = doc.getElementById('showCityPicker'); 138 139 showCityPickerButton.addEventListener('tap', function(event) { 140 cityPicker.show(function(items) { 141 showCityPickerButton.value = items[0].text + " " + items[1].text; 142 //返回 false 可以阻止选择框的关闭 143 //return false; 144 citys = items[1].value; 145 console.log(JSON.stringify(citys)); 146 // return citys; 147 }); 148 }, false); 149 150 }) 151 })(mui, document) 152 //console.log(JSON.stringify(citys)); 153 } else { 154 alert(JSON.stringify(err)); 155 } 156 }); 157 }; 158 159 //获取门店 160 var userPicker; 161 (function($, doc) { 162 $.init(); 163 $.ready(function() { 164 //普通示例 165 userPicker = new $.PopPicker(); 166 //userPicker.setData(z_newarr); 167 var choose_inn = doc.getElementById('choose_store'); 168 choose_inn.addEventListener('tap', function(event) { 169 userPicker.show(function(items) { 170 choose_inn.value = items[0].text; 171 //返回 false 可以阻止选择框的关闭 172 //return false; 173 }); 174 }, false); 175 }) 176 })(mui, document) 177 //choose_store(); 178 function choose_store() { 179 //console.log(JSON.stringify(citys)); 180 api.ajax({ 181 url: 'http://xxxxxxx.xxxxxxx.cn/index/carlease/storeList', 182 method: 'post', 183 data: { 184 values: { 185 city_id: citys 186 } 187 } 188 }, function(ret, err) { 189 if (ret) { 190 console.log(JSON.stringify(citys)); 191 var sto = ret.data.storelist; 192 var arr = []; 193 sto.forEach(function(item) { 194 arr.push({ 195 city_id: item.city_id, 196 store_name: item.store_name 197 }) 198 }) 199 200 var newarr = JSON.stringify(arr).replace(/city_id/g, "value").replace(/store_name/g, "text") 201 var z_newarr = JSON.parse(newarr); 202 203 console.log(JSON.stringify(z_newarr)); 204 // (function($, doc) { 205 // $.init(); 206 // $.ready(function() { 207 // //普通示例 208 // var userPicker = new $.PopPicker(); 209 // userPicker.setData(z_newarr); 210 // var choose_inn = doc.getElementById('choose_store'); 211 // choose_inn.addEventListener('tap', function(event) { 212 // userPicker.show(function(items) { 213 // choose_inn.value = items[0].text; 214 // //返回 false 可以阻止选择框的关闭 215 // //return false; 216 // continue; 217 // }); 218 // }, false); 219 // }) 220 // })(mui, document) 221 userPicker.setData(z_newarr); 222 223 } else { 224 alert(JSON.stringify(err)); 225 } 226 }); 227 } 228 229 230 231 function choose_shop() { 232 $api.css(car_leibie, 'display:block'); 233 }; 234 235 236 function closeWin() { 237 api.closeWin({}); 238 }; 239 </script> 240 241 </html>
ps:其他问题
从一串数组数据中截取需要的数据
1 var sto = ret.data.storelist; 2 var arr = []; 3 sto.forEach(function(item) { 4 arr.push({ 5 city_id: item.city_id, 6 store_name: item.store_name 7 }) 8 })
2018-12-22 13:09:21
操作数组
1 var sto = ret.contacts; 2 var arr = []; 3 sto.forEach(function(item) { 4 arr.push({ 5 contact_name: item.fullName, 6 contact_mobile: item.phones 7 }) 8 }) 9 10 // console.log(JSON.stringify(arr)); 11 // var aaa = JSON.stringify(arr).replace(/\{\"呼叫单位\"\:\"/g,"\"").replace(/\{\"呼叫手机\"\:\"/g,"\"").replace(/\{\"呼叫住宅电话\"\:\"/g,"\"").replace(/\"\}/g,"\""); 12 // console.log(JSON.stringify(aaa)); 13 14 // console.info(JSON.stringify(arr)); 15 for (var i in arr) { 16 var contact_mobile = arr[i]['contact_mobile']; 17 var contact_mobile_new = new Array; 18 for (var j in contact_mobile) { 19 var maps = contact_mobile[j]; 20 for (var n in maps) { 21 contact_mobile_new.push(maps[n]); 22 } 23 } 24 arr[i]['contact_mobile'] = contact_mobile_new; 25 } 26 console.info(JSON.stringify(arr));