Клуб API Карт

Как закрыть SuggestView?

Пост в архиве.

Здравствуйте!

При изменении скриптом инпута, к которому привязан SuggestView, появляется выпадающая панель с подсказками. Как этого избежать, или как закрыть ее после появления?

17 комментариев
Сам мучаюсь, и похоже что ответ "никак". Из доступных методов - только destroy(). Из доступных событий - вообще ноль. Программное изменение текста инпута вызывает практически принудительное всплытие suggest'a, кторому плевать на то, что событие onchange/onfocus/onclick не происходило. Попутно спрошу у отзывчивого саппорта - как избежать появления suggest, если он полностью совпадает с содержимым поля ввода, он ведь бесполезен в этом случае, а при клике все равно всплывает?
kosilka75,

> как избежать появления suggest, если он полностью совпадает с содержимым поля ввода, он ведь бесполезен в этом случае, а при клике все равно всплывает?


Это решается через свой provider
dimik,
ReferenceError: ISuggestProvider is not defined

kosilka75,
это не объект, это интерфейс, который надо реализовать
dimik,
 

suggest = new ymaps.SuggestView($keywords[0], {
  results: 10,
   provider: {
     suggest: function(req, opts)  {
      


     }

   },
});


TypeError: this._makeRequest(...) is undefined
kosilka75,
У меня нет этой ошибки
https://jsfiddle.net/v9hee4w4/1/
dimik,
Спасибо, понял. Трудновато по документации ориентироваться, не все очевидно.
kosilka75,
Предложения по улучшению документации всегда принимаются и рассматриваются. Лично я (не разработчик АПИ) не испытываю с ней проблем – обычная документация не хуже и не лучше чем все другие документации.
Динамическое обновление без показа подсказок можно сделать через свой макет – опция layout.


https://jsfiddle.net/v9hee4w4/
Спасибо большое, но это фактически равносильно тому, чтобы делать ему destroy(). Ведь после установки suggestView.state.set('open', false) , suggestView перестает работать. Если я делаю:
===============================

suggestView.state.set({
open: false,
panelClosed: true,
items: []
});
document.getElementById('suggest').value = 'санкт-петербург';
suggestView.state.set('open', true);
===============================
чтобы разрешить дальнейшую работу пользователя, то в момент установки опции в true, подсказка снова всплывает.


bonkor,
Видимо надо было хачить провайдер.
https://jsfiddle.net/v9hee4w4/3/
dimik,
просто слов нет! Спасибо огромное!


P.S. А про .events.once() где-то написано?
bonkor,
https://tech.yandex.ru/maps/doc/jsapi/2.1/ref/reference/event.Manager-docpage/#once
dimik,
пишет, что Cannot read property 'state' of undefined, указывая на строку return (suggestView.state.get('open'). А у вас всё нормально.
Обновлено 1 июля 2020, 12:48
dimik,



Круто!
От себя добавлю пример, когда нужно чтобы искал только по Волгоградской области, + если в результате есть улица с номером дома, номер дома попадал в отдельное текстовое поле, а в обычном оставалась улица без дома:


<script src="//api-maps.yandex.ru/2.1/?lang=ru_RU&amp;onload=onLoad"></script>
<script>
function onLoad (ymaps) {
var suggestView = new ymaps.SuggestView('suggest', {
boundedBy: [[48.215401, 43.823443], [49.032926, 45.196734]],
provider: {
suggest: (function(request, options) {
request = "Россия, Волгоградская область, " + request;
return (suggestView.state.get('open') ?
ymaps.suggest(request) : ymaps.vow.resolve([]))
.then(function (res) {
suggestView.events.fire('requestsuccess', {
target: suggestView,
});
return res;
})
})}
});
suggestView.state.set('open', true);
suggestView.events.add('select', function (e) {
var value = e.get('item').value;
var streets = [
'Россия, Волгоградская область, ',
'Россия, Волгоград, '
];
for(var i = 0; i < streets.length; i++) {
value = value.replace(streets[i], '');
}
var house = value.substring(value.indexOf(", ") + 2);
var firstLetter = parseInt(house[0]);
suggestView.state.set({open: false});
if(!_.isNaN(firstLetter) && _.isNumber(firstLetter)) {
$('[data-js-basket-form-house]').val(house);
$('[data-js-basket-form-street]').val(value.replace(', ' + house, ''));
} else {
$('[data-js-basket-form-street]').val(value);
}
suggestView.events.once('requestsuccess', function () {
suggestView.state.set('open', true);
});
});
}
</script>
Весьма странно, что такие базовые и очевидные вещи решаются такими вот костылями.


А мне всего-то надо удалять Россию (что тоже можно было бы сделать опцией).


Даже форматирование кода до сих пор яндекс не может сделать, и это в блоге-то, где постоянно примеры кода вставляют. Позорище.


var search = document.getElementById('delivery-address');


new ymaps.SuggestView(search).events.add('select', function () {
    search.value = search.value.replace('Россия, ', '');
});
Обновлено 28 ноября 2019, 20:50
Нормальное (и ожидаемое) закрытие списка по клику на пункте до сих пор не работает. Причём, когда вышеописанное вставляешь в песочницу яндекса, всё закрывается нормально. А у себя - нет.
Обновлено 1 июля 2020, 11:49