Dojo Combobox [Enter] Ответ хранилища данных по ключевым событиям - PullRequest
0 голосов
/ 14 апреля 2011

Я настроил комбинированный список dojo следующим образом:

this.autoComplete = new dijit.form.ComboBox( {
  id : this.name + "_term",
  name : "search_id",
  store : this.dataStore,
  searchAttr : "term",
  pageSize : "30",
  searchDelay:500,
  value : this.config.inputText,
  hasDownArrow : false
}, this.name + "_term");

Проблема здесь в том, что когда пользователь вводит свой поисковый запрос и нажимает [Enter] до 500 мс, запрос на обслуживание отменяется (обычно,скопировать и вставить поисковый запрос).Я ожидал, что он просто проигнорирует событие [Enter] до тех пор, пока запрос не будет выполнен, и опции не отобразятся в раскрывающемся списке.Затем пользователь может снова нажать Enter, чтобы отправить первый элемент в ответе.

Надеясь получить некоторые предложения о том, как справиться с этим сценарием.Я просмотрел API для dijit.form.ComboBox, но не увидел ничего убедительного, что могло бы решить эту проблему.Обратите внимание, что точно такое же поведение существует, если я использую FilteringSelect вместо ComboBox.Интересно, что FilteringSelect рассматривает этот сценарий как ошибку, которая обрабатывается параметром "invalidMessage".Я не понимаю выгоды от этого как ошибки.

1 Ответ

1 голос
/ 16 апреля 2011

Я (временно) решил эту проблему, исправив изменения в dijit.form.ComboBox путем переопределения функции _onKeyPress.Я использую dojo v1.5 и заметил, что v1.6 изменил _onKeyPress на _onKey.Таким образом, модернизация, очевидно, сломает вещи.

Я обновил обработку события [Enter] следующим образом:

  case dk.ENTER:
    // prevent submitting form if user presses enter. Also
    // prevent accepting the value if either Next or Previous
    // are selected
    if(highlighted){
      // only stop event on prev/next
      if(highlighted == pw.nextButton){
        this._nextSearch(1);
        dojo.stopEvent(evt);
        break;
      }else if(highlighted == pw.previousButton){
        this._nextSearch(-1);
        dojo.stopEvent(evt);
        break;
      }
    }else{
      if (!module.autoComplete.item) {
        doSearch = true;
      }
      // Update 'value' (ex: KY) according to currently displayed text
      this._setBlurValue(); // set value if needed
      this._setCaretPos(this.focusNode, this.focusNode.value.length); // move cursor to end and cancel highlighting
    }
    // default case:
    // prevent submit, but allow event to bubble
    evt.preventDefault();
    // fall through
    break;

Код вопроса:

if (!module.autoComplete.item) {
  doSearch = true;
}

Я в основном говорювыполнять поиск только в том случае, если экземпляр объекта автозаполнения существует и еще не получил ни одного элемента.Это безобразный хак, но он решает проблему на данный момент.Я все еще хотел бы некоторые предложения о том, как справиться с этим лучше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...