Клуб API Карт

Поиск адреса в текстовом поле с помощью searchControl

seo.sinercom
26 августа 2016, 18:17

Добрый день.

Делаю интерактивный поиск адреса с помощью searchControl
search_query - запрос, который вводит пользователь
self.searchControl.search('Россия, Санкт-Петербург '+search_query+'').then(function(){
 здесь обрабатываю результаты поиска
});

Ищу: металлистов пр. 76
1. Первый момент
Все центрует и находит до момента пока не ввожу вторую цифру 6. На ней все стопорится. Убираю ее все находит.
2. Второй момент
Когда все стираю и хочу найти другой адрес уже ничего не ищет.

Подскажите, что делаю не так.
Спасибо.
 

18 комментариев
Подписаться на комментарии к посту
Нужна ссылка на страницу с этим кодом
Пока могу показать только куски кода. Может по ним можно как-то понять.
/**Инициализаруем карту и центруем*/
initMap:function(){
this.mapControl = new ymaps.Map("ymap", {
center: [59.915674, 30.363117],
zoom: 10
});
}
//Создаем объект поисковых подсказок
addSearchControl:function(){
this.searchControl = new ymaps.control.SearchControl({
options: {
useMapBounds: true,
strictBounds: true
}
});
//Привязываем карту
this.mapControl.controls.add(this.searchControl);
}
//Сам процесс реализации поиска
var search_query = "Запрос клиента"
var search_result = [];
self.searchControl.search('Россия, Санкт-Петербург '+search_query+'').then(function(){
//Складываю результаты в глобальную переменную
self.geoObjectsArray = self.searchControl.getResultsArray();
if (self.geoObjectsArray.length) {
//Показываю выпадающий список
jQuery('#search-street').show();
//Прохожу по найденным значениям
for(var i = 0; i < self.geoObjectsArray.length; i++){
search_result.push({label: self.geoObjectsArray[i].properties.get('text')});
}
//Отображения найденных значений в html
html='';
for (var i in search_result) {
html+='<li onclick="searchAdr.selectAddress(this, '+i+')">'+search_result[i].label+'</li>';
}
$("#search-street").html(html);
}
});
seo.sinercom,
Я для отладки использую Developer Tools. Телепатию не использую. Если нет страницы, соберите на jsfiddle минимальный пример на котором воспроизводится проблема.
Работающий пример, с картой, тестовым полем и вот этим всем. 

Собрал минимальный проект: http://on-realty.com/apiyandex/
Посмотрите пожалуйста.
Собрал минимальный проект: http://on-realty.com/apiyandex/

Посмотрите пожалуйста.
seo.sinercom,
У вас сейчас не правильно обрабатывается готовность АПИ


Из-за этого возникает ошибка
index.js:23 Uncaught TypeError: ymaps.Map is not a constructor



Вот это все не нужно, используйте ymaps.ready


window.setTimeout(function(){
searchAdr.initMap();
searchAdr.addSearchControl();
}, 1000);


dimik,
Заменил, но результат не поменялся.
seo.sinercom,
У вас стоит опция  strictBounds: true – искать СТРОГО в области видимости карты. Когда вы ищете "металлистов пр. 7" он центрирует и зумит на 7-ой дом. Затем вы вводите "6", но 76 дом уже не попадает в область видимости карты (дома №7) и поиск ничего не находит.


Если strictBounds: true закомментировать, то все находится
https://jsfiddle.net/yajwevmy/1/



Искать таким образом (по keyup) через поиск – плохой вариант
Во-первых, поиск плохо ищет по чанкам, т.к. он для этого не предназначен.
Во-вторых, так вы быстро исчерпаете разрешенный лимит и будете забанены.


В такой схеме надо сначала использовать что-то типа suggest/SuggestView
и уже с полученными от него подсказками, с выбранным вариантом  идти в поиск (один раз)

dimik,
Спасибо за рекомендацию. Все получилось.
А у меня еще вопрос, а лимит срабатывает, когда я обращаюсь к searchControl.search?
А если я сначала через  ищу suggest/SuggestView, то лимит не учитывается?
И какой вообще у меня лимит на запросы?

Спасибо.
seo.sinercom,
Срабатывает – поиск топонимов ходит в геокодер (25 000 в сутки). У саджеста лимита нет.
dimik,
ОК. Спасибо большое за помощь.
dimik,
Я обновил проект - https://jsfiddle.net/yajwevmy/1/
Сделал через SuggestView
Набираю Павловск и все находит.
Набираю Пушкин и не находит.

С чем это может быть связано?
seo.sinercom,
По ссылке https://jsfiddle.net/yajwevmy/1/ нет вызовов SuggestView
dimik,
Виноват. Промахнулся - https://jsfiddle.net/yajwevmy/10/
seo.sinercom,
В зависимости от типа топонима в xaL могут лежать структуры разной вложенности, ваш код, который пытается их получить подобным образом просто падает с ошибкой 


prop = prop.AdministrativeArea.Locality;
//Локаль (город - область)
city = prop.LocalityName;
//Улица
street = prop.Thoroughfare.ThoroughfareName;
//Номер дома
number_house = prop.Thoroughfare.Premise.PremiseNumber;


Используйте методы класса GeocodeResult
dimik,
Удалил пока все лишнее. Буду работать с GeocodeResult. Спасибо.
Обновил проект.
Павловск находит.
Пушкин и Колпино не находит.
https://jsfiddle.net/yajwevmy/13/
dimik,
Ну я имею ввиду, что на карте не центрует.
seo.sinercom,
Центрировать он будет только если найден единственный результат. Для "Пушкин" и "Колпино" находится несколько результатов, и подразумевается, что пользователь сам должен выбрать popup контрола какой именно из них он хочет увидеть.


По хорошему тут надо использовать геокодер, а не через SearchControl искать. Если вы используете свой UI для поиска (внешний инпут), зачем добавлять на карту контрол?


Чтобы сэкономить свое и ваше время и количество граблей на которые вы еще наступите – вот готовый пример того, что вы делаете. Код на гитхабе.