一、关键词输入提示
options属性说明:
属性 | 类型 | 必填 | 说明 |
---|---|---|---|
keyword | String | 是 | 用户输入的关键词(希望获取后续提示的关键词) |
region | String | 否 | 设置城市名,限制关键词所示的地域范围,如,仅获取“广州市”范围内的提示内容,默认值全国 |
region_fix | Number | 否 | 取值: 0:[默认]当前城市无结果时,自动扩大范围到全国匹配 1:固定在当前城市 |
policy | Number | 否 | 检索策略,目前支持 policy=0:默认,常规策略; policy=1:本策略主要用于收货地址、上门服务地址的填写, |
location | String | 否 | 定位坐标,传入后,若用户搜索关键词为类别词(如酒店、餐馆时),与此坐标距离近的地点将靠前显示,格式: location=lat,lng (示例:location:39.11457,116.55332) |
get_subpois | Number | 否 | 是否返回子地点,如大厦停车场、出入口等取值: 0 [默认]不返回 1 返回 该参数适用于 jssdkv1.1 jssdkv1.2 |
filter | String | 否 | 最多支持五个分类 搜索指定分类 category=公交站 搜索多个分类 category=大学,中学 (注意参数值要进行url编码) 该参数适用于 jssdkv1.1 jssdkv1.2 |
address_format | String | 否 | 短地址,缺省时返回长地址,可选值:'short’ 该参数适用于 jssdkv1.1 jssdkv1.2 |
page_size | Number | 否 | 每页条目数,最大限制为20条,默认值10 该参数适用于 jssdkv1.1 jssdkv1.2 |
page_index | Number | 否 | 第x页,默认第1页 该参数适用于 jssdkv1.1 jssdkv1.2 |
sig | String | 否 | 签名校验 开启WebServiceAPI签名校验的必传参数,只需要传入生成的SK字符串即可,不需要进行MD5加密操作 该参数适用于 jssdkv1.2 |
调用结果:
1.通过属性success, fail, complete的回调参数来接收调用结果
2.success的回调参数可以有2个,第1个参数接收调用结果,第2个参数控制返回处理后的数据(非必须参数),示例:success:function(res,data)
3. 该属性适用于 jssdkv1.1 jssdkv1.2
二、示例
WXML 模板文件中添加组件:
<!--绑定输入事件-->
<input style="border:1px solid black;" bindinput="getsuggest" value="{{backfill}}"></input>
<!--关键词输入提示列表渲染-->
<view wx:for="{{suggestion}}" wx:key="index">
<!--绑定回填事件-->
<view>
<!--根据需求渲染相应数据-->
<!--渲染地址title-->
<view style="text-align:center;" bindtap="backfill" id="{{index}}">{{item.title}}</view>
<!--渲染详细地址-->
<view style="font-size:12px;color:#666;text-align:center;">{{item.addr}}</view>
</view>
</view>
Javascript 关键代码片段:
// 引入SDK核心类
var QQMapWX = require('xxx/qqmap-wx.js');
// 实例化API核心类
var qqmapsdk = new QQMapWX({
key: '开发密钥(key)' // 必填
});
//在Page({})中使用下列代码
//数据回填方法
backfill: function (e) {
var id = e.currentTarget.id;
for (var i = 0; i < this.data.suggestion.length;i++){
if(i == id){
this.setData({
backfill: this.data.suggestion[i].title
});
}
}
},
//触发关键词输入提示事件
getsuggest: function(e) {
var _this = this;
//调用关键词提示接口
qqmapsdk.getSuggestion({
//获取输入框值并设置keyword参数
keyword: e.detail.value, //用户输入的关键词,可设置固定值,如keyword:'KFC'
//region:'北京', //设置城市名,限制关键词所示的地域范围,非必填参数
success: function(res) {//搜索成功后的回调
console.log(res);
var sug = [];
for (var i = 0; i < res.data.length; i++) {
sug.push({ // 获取返回结果,放到sug数组中
title: res.data[i].title,
id: res.data[i].id,
addr: res.data[i].address,
city: res.data[i].city,
district: res.data[i].district,
latitude: res.data[i].location.lat,
longitude: res.data[i].location.lng
});
}
_this.setData({ //设置suggestion属性,将关键词搜索结果以列表形式展示
suggestion: sug
});
},
fail: function(error) {
console.error(error);
},
complete: function(res) {
console.log(res);
}
});
}
三、项目代码
1.regeo.wxml中加入如下代码:
<view wx:if="{{addListShow}}">
<view class="top">
<view class="back iconfont icon-fanhui" bindtap="back1"></view>
<view class="search-box {{addListShow?'search-box1':''}}">
<view class="region" bindtap="chooseCity">{{currentRegion.district}}</view>
<view class="shu"></view>
<input bindinput="getsuggest" placeholder="查找具体地点"></input>
</view>
</view>
<!--关键词输入提示列表渲染-->
<view class="add-list-box">
<scroll-view class="add-list" scroll-y>
<view class="add-item" wx:for="{{suggestion}}" wx:key="index">
<!--绑定回填事件-->
<view bindtap="backfill" id="{{index}}" data-name="{{item.title}}">
<!--根据需求渲染相应数据-->
<!--渲染地址title-->
<view class="title">{{item.title}}</view>
<!--渲染详细地址-->
<view class="add">{{item.addr}}</view>
</view>
</view>
</scroll-view>
</view>
</view>
2.regeo.js中加入如下代码
back1: function () {
if (this.data.addListShow) {
this.setData({
addListShow: false
})
} else {
wx.navigateBack({
delta: 1
})
}
},
chooseCity: function () {
let self = this;
self.getRegionData();
self.setData({
chooseCity: true,
regionShow: {
province: false,
city: false,
district: true
},
currentProvince: self.data.currentRegion.province,
currentCity: self.data.currentRegion.city,
currentDistrict: self.data.currentRegion.district,
})
},
getRegionData: function () {
let self = this;
//调用获取城市列表接口
qqmapsdk.getCityList({
success: function (res) {//成功后的回调
console.log(res)
let provinceArr = res.result[0];
let cityArr = [];
let districtArr = [];
for (var i = 0; i < provinceArr.length; i++) {
var name = provinceArr[i].fullname;
if (self.data.currentRegion.province == name) {
if (name == '北京市' || name == '天津市' || name == '上海市' || name == '重庆市') {
cityArr.push(provinceArr[i])
} else {
qqmapsdk.getDistrictByCityId({
// 传入对应省份ID获得城市数据,传入城市ID获得区县数据,依次类推
id: provinceArr[i].id,
success: function (res) {//成功后的回调
//console.log(res);
cityArr = res.result[0];
self.setData({
regionData: {
province: provinceArr,
city: cityArr,
district: districtArr
}
})
},
fail: function (error) {
//console.error(error);
},
complete: function (res) {
//console.log(res);
}
});
}
}
}
for (var i = 0; i < res.result[1].length; i++) {
var name = res.result[1][i].fullname;
if (self.data.currentRegion.city == name) {
qqmapsdk.getDistrictByCityId({
// 传入对应省份ID获得城市数据,传入城市ID获得区县数据,依次类推
id: res.result[1][i].id,
success: function (res) {//成功后的回调
//console.log(res);
districtArr = res.result[0];
self.setData({
regionData: {
province: provinceArr,
city: cityArr,
district: districtArr
}
})
},
fail: function (error) {
//console.error(error);
},
complete: function (res) {
//console.log(res);
}
});
}
}
},
fail: function (error) {
//console.error(error);
},
complete: function (res) {
//console.log(res);
}
});
},
//选择省
showProvince: function () {
this.setData({
regionShow: {
province: true,
city: false,
district: false
}
})
},
//选择城市
showCity: function () {
this.setData({
regionShow: {
province: false,
city: true,
district: false
}
})
},
//选择地区
showDistrict: function () {
this.setData({
regionShow: {
province: false,
city: false,
district: true
}
})
},
//选择省之后操作
selectProvince: function (e) {
//console.log(e)
let self = this;
let id = e.currentTarget.dataset.id;
let name = e.currentTarget.dataset.name;
self.setData({
currentProvince: name,
currentCity: '请选择城市',
})
if (name == '北京市' || name == '天津市' || name == '上海市' || name == '重庆市') {
var provinceArr = self.data.regionData.province;
var cityArr = [];
for (var i = 0; i < provinceArr.length; i++) {
if (provinceArr[i].fullname == name) {
cityArr.push(provinceArr[i])
self.setData({
regionData: {
province: self.data.regionData.province,
city: cityArr,
district: self.data.regionData.district
}
})
self.showCity();
return;
}
}
} else {
let bjj = self.data.regionShow;
console.log(bjj)
let bj = JSON.stringify(bjj)
console.log(bj)
self.getById(id, name, bj)
}
},
//选择城市之后操作
selectCity: function (e) {
let self = this;
let id = e.currentTarget.dataset.id;
let name = e.currentTarget.dataset.name;
self.setData({
currentCity: name,
currentDistrict: '请选择城市',
})
let bjj = self.data.regionShow;
var bj = JSON.stringify(bjj)
self.getById(id, name, bj)
},
//选择区县之后操作
selectDistrict: function (e) {
let self = this;
let id = e.currentTarget.dataset.id;
let name = e.currentTarget.dataset.name;
let latitude = e.currentTarget.dataset.latitude;
let longitude = e.currentTarget.dataset.longitude;
var b = {
id: 0,
latitude: latitude,
longitude: longitude,
iconPath: "../../src/images/ding.png"
}
var markers = this.data.markers
markers.push(b)
self.setData({
currentDistrict: name,
latitude: latitude,
longitude: longitude,
currentRegion: {
province: self.data.currentProvince,
city: self.data.currentCity,
district: name
},
markers,
bottom: {
title: self.data.currentProvince + "," + self.data.currentCity + "," + name,
addr: self.data.currentProvince + "," + self.data.currentCity + "," + name,
latitude: latitude,
longitude: longitude,
},
showbottom: true,
chooseCity: false,
keyword: self.data.defaultKeyword
})
// self.nearby_search();
},
//根据选择省市加载市区列表
getById: function (id, name, bj) {
let self = this;
// var bj=JSON.parse(bj)
console.log(bj)
qqmapsdk.getDistrictByCityId({
// 传入对应省份ID获得城市数据,传入城市ID获得区县数据,依次类推
id: id, //对应接口getCityList返回数据的Id,如:北京是'110000'
success: function (res) {//成功后的回调
console.log(res);
console.log(bj)
if (self.data.regionShow.province) {
self.setData({
regionData: {
province: self.data.regionData.province,
city: res.result[0],
district: self.data.regionData.district
}
})
self.showCity();
} else if (self.data.regionShow.city) {
self.setData({
regionData: {
province: self.data.regionData.province,
city: self.data.regionData.city,
district: res.result[0]
}
})
self.showDistrict();
} else {
self.setData({
chooseCity: false,
})
}
},
fail: function (error) {
//console.error(error);
},
complete: function (res) {
//console.log(res);
}
});
},
showAddList: function () {
this.setData({
addListShow: true
})
},
getsuggest: function (e) {
var _this = this;
var keyword = e.detail.value;
_this.setData({
addListShow: true
})
//调用关键词提示接口
qqmapsdk.getSuggestion({
//获取输入框值并设置keyword参数
keyword: keyword, //用户输入的关键词,可设置固定值,如keyword:'KFC'
location: _this.data.latitude + ',' + _this.data.longitude,
page_size: 20,
page_index: 1,
//region:'北京', //设置城市名,限制关键词所示的地域范围,非必填参数
success: function (res) {//搜索成功后的回调
//console.log(res);
var sug = [];
for (var i = 0; i < res.data.length; i++) {
sug.push({ // 获取返回结果,放到sug数组中
title: res.data[i].title,
id: res.data[i].id,
addr: res.data[i].address,
province: res.data[i].province,
city: res.data[i].city,
district: res.data[i].district,
latitude: res.data[i].location.lat,
longitude: res.data[i].location.lng
});
}
_this.setData({ //设置suggestion属性,将关键词搜索结果以列表形式展示
suggestion: sug,
nearList: sug,
keyword: keyword
});
},
fail: function (error) {
//console.error(error);
},
complete: function (res) {
//console.log(res);
}
});
},
3.regeo.wxss中添加如下代码:
.top {
width: 100%;
height: 80rpx;
line-height: 80rpx;
position: fixed;
top: 140rpx;
left: 0;
padding: 30rpx 20rpx;
z-index: 999;
overflow: hidden;
}
.back {
width: 80rpx;
height: 80rpx;
line-height: 80rpx;
color: #666;
text-align: center;
background: rgb(255,255,255);
font-size: 50rpx;
border-radius: 50%;
float: left;
}
.back cover-image{
width: 50rpx;
height: 50rpx;
display: inline-block;
margin-top: 15rpx;
}
.search-box {
width: 610rpx;
height: 80rpx;
line-height: 80rpx;
border-radius: 40rpx;
background: rgb(255,255,255);
margin-left: 20rpx;
float: left;
overflow: hidden;
}
.search-box1 {
border: 1px solid #ccc;
border-radius: 10rpx;
background: #eee;
}
.search-box .region {
width: 199rpx;
line-height: 80rpx;
font-size: 30rpx;
color: #282828;
text-align: center;
float: left;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.search-box .shu {
width: 1rpx;
height: 80rpx;
background:#ccc;
float: left;
}
.search-box input {
width: 380rpx;
height: 80rpx;
line-height: 80rpx;
font-size: 30rpx;
color: #282828;
padding: 10rpx 20rpx;
box-sizing: border-box;
float: left;
}
.search-box .placeholder{
width: 380rpx;
height: 80rpx;
line-height: 80rpx;
font-size: 30rpx;
color: #ccc;
padding: 0 20rpx;
box-sizing: border-box;
float: left;
}
.add-list-box {
position: absolute;
width: 100%;
height: 100%;
top: 140rpx;
z-index: 998;
padding-top: 150rpx;
background: #fff;
box-sizing: border-box;
overflow: hidden;
}
.add-list {
width: 100%;
height: 1000rpx;
}
.add-item {
line-height: 40rpx;
padding: 30rpx 50rpx;
text-align: left;
border-top: 1px solid #eee;
}
.add-item .title {
color: #282828;
font-size: 32rpx;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.add-item .add {
color: #707070;
font-size: 24rpx;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
四、效果图展示