0
Answered

Разбор подсказок по разным полям

Anonymous 2 years ago • updated 2 years ago 21

Здравствуйте! У меня есть 2 поля, 1 для города, 2 для адреса
И при вводе города изначально менял формат через OnSelect и делал в формате "город,обл,район,индекс", но при вводе улицы, формат города менялся что нельзя делать. Сейчас сделать через formatSelected функцию, но теперь при вводе улицы нет индекса, без него тоже никак. Как быть в данной ситуации? 
И сейчас попытался авторизоваться с данными на сайте, но мне пишет что неверный пароль, хотя на сайте вхожу.

Answer

Answer

Да, вы правы. Метод для форматирование результата — formatSelected. Но пробел подставляется уже после того, как он вызывается.


Штатного способа убрать пробел я не вижу. Можно попробовать через хак, но это не слишком надёжно и может отломаться в следующих версиях плагина:

var sgt = $("#address").suggestions();
var oldSelectSuggestion = sgt.selectSuggestion;
sgt.selectSuggestion = function (suggestion, index, lastValue, selectionOptions) {
  var options = selectionOptions || {};
  options.noSpace = true;
  oldSelectSuggestion.call(sgt, suggestion, index, lastValue, selectionOptions);
}
Under review

Добрый день! Можете дать ссылку на страницу, где можно посмотреть всё это в действии? Из описания я слабо понял, что не так и что надо сделать.

К сожалению, ссылки нет. Переформулирую вопрос. При гранулярных полях(т.е. город, улица в разных полях).
При заполнении улицы перезаполняется город.
Например: ввел в инпут с городом Тулу, выбрал из списка(при этом использую переформатирование адреса и подставляю индекс). Затем ввожу в инпут с улицей улицу и выбираю ее. Как итог поле с городом перезаполнилось автоматически и индекс убрался (поле сделалось по умолчанию)

Боюсь, что гранулярные подсказки плохо сочетаются с изменением формата. Почему бы просто не вывести индекс в отдельное поле?

Потому что до этого использовали подсказки другого сервиса, но последнее время он совсем не стабильный, а весь функционал переписывать не очень хочется. Я вроде как решил проблему, отрыл на форуме вот такую функцию: 

  function enforceCity(suggestion) {
    var sgt = $street.suggestions();
    sgt.setOptions({
      constraints: {
        locations: { kladr_id: suggestion.data.kladr_id }
      },
      formatSelected: formatSelectedS,
      restrict_value: true
    });
})

Answered

Хорошо, раз такой вариант вам подходит.

Подскажите еще, есть ли какой-либо метод, который вызывается перед самой вставкой результата в поле? т.к. столкнулся с проблемой, когда в конце строки добавляется пробел. При этом value результата без пробела в конце. Как пример: Выбираю город, из полученного массива формирую необходимую строку и подставляю ее в suggestion.value. А в итоге получается пробел в конце строки.

Этот метод разве используется не для выполнения каких-либо действий с выпадающим списком? Я имею ввиду вот этот пробел https://prnt.sc/gpeu51 когда уже выбран какой-либо н/п

Answer

Да, вы правы. Метод для форматирование результата — formatSelected. Но пробел подставляется уже после того, как он вызывается.


Штатного способа убрать пробел я не вижу. Можно попробовать через хак, но это не слишком надёжно и может отломаться в следующих версиях плагина:

var sgt = $("#address").suggestions();
var oldSelectSuggestion = sgt.selectSuggestion;
sgt.selectSuggestion = function (suggestion, index, lastValue, selectionOptions) {
  var options = selectionOptions || {};
  options.noSpace = true;
  oldSelectSuggestion.call(sgt, suggestion, index, lastValue, selectionOptions);
}

А почему бы его не убрать вообще в плагине? я думаю он мешается большинству и как по мне, так смысла не несет вовсе.

Чем же он мешает? Он помогает вводить адрес (выбрал подсказку и продолжаешь печатать). У вас довольно экзотический сценарий, мне кажется.

Экзотический мягко сказано=) Спасибо за предоставленные ответы. Вы очень помогли.

Пожалуйста ツ

А есть ли какой-либо метод, который идентичен formatResult, но вызывается только 1 раз? Просто еще есть необходимость добавить иностранные города, для этого есть табличка в базе со всеми необходимыми данными и планирую из базы подтягивать эти города, при вводе их в поле.

Если я правильно понял, вы хотите «подмешать» результаты в ответ от подсказок. Для этого подойдёт обработчик onSuggestionsFetch.

Нашел метод

onSearchComplete

Он бы идеально подходил, но почему то вызывается он после появления выпадающего списка.

А можно ли как то получить query, т.е. по какой строке поиска была выдача по данному обработчику?

Нет, но вы можете предварительно получить его из onSearchStart.

Спасибо. А еще подскажите, почему обработчик onSuggestionsFetch вызывается так же при выборе населенного пункта?

Он вызывается каждый раз, когда сервер что-то возвращает. При выборе конкретного адреса идёт запрос на сервер (для получения дополнительной информации вроде геокоординат), поэтому он срабатывает.

Хорошо, спасибо за предоставленные ответы.