scriptaculous ajax автозаполнение пустой ответ - PullRequest
3 голосов
/ 18 марта 2009

Я работаю с ajax-autocompleter, который отлично работает. Моя цель - перенаправление между функцией редактирования для существующего элемента или функцией создания для не найденного элемента.

Я вставляю определенный идентификатор для каждого li и поэтому могу использовать его для функции редактирования с параметром afterUpdateElement.

Но если результатов не найдено, список пуст, и я не могу найти способ сообщить сценарию afterUpdateElement, что никаких результатов не найдено. Действительно, afterUpdateElement не вызывается, так как выбор отсутствует. Так что afterUpdateElement бесполезен…

Я думал о проверке полного значения, отправленного запросом ajax. Но я не нашел, как его схватить ...

Ответы [ 2 ]

1 голос
/ 19 марта 2009

Вы можете попробовать переписать метод updateChoices следующим образом:

Ajax.Autocompleter.prototype.updateChoices =  function (choices) {
if(!this.changed && this.hasFocus) {

      if(!choices) {
        //do your "new item" thing here
      }
      else {
         this.update.innerHTML = choices;
         Element.cleanWhitespace(this.update);
         Element.cleanWhitespace(this.update.down());

         if(this.update.firstChild && this.update.down().childNodes) {
           this.entryCount =
             this.update.down().childNodes.length;
           for (var i = 0; i < this.entryCount; i++) {
             var entry = this.getEntry(i);
             entry.autocompleteIndex = i;
             this.addObservers(entry);
           }
         } else {
           this.entryCount = 0;
         }

         this.stopIndicator();
         this.index = 0;

         if(this.entryCount==1 && this.options.autoSelect) {
           this.selectEntry();
           this.hide();
         } else {
           this.render();
         }
      }
   }
}

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

РЕДАКТИРОВАТЬ: pff .. извините за плохие отступы, но это копирование / вставка из TextMate и имеет вкладки в сочетании с пробелами. Я надеюсь, что вы поняли, хотя. Единственное, что я добавил, было

      if(!choices) {
        //do your "new item" thing here
      }
      else {}

блок. Кроме того, я не тестировал код, но думаю, что он должен работать.

1 голос
/ 19 марта 2009

Итак, я наконец нашел способ проверить, были ли выбраны результаты или нет (с огромной помощью Gwyohm):

  1. Прежде всего, мы устанавливаем скрытое поле, которое будет записывать, если был выбран результат (true / false). По умолчанию установлено значение ЛОЖЬ.
  2. Элемент afterUpdateElement используется только после выбора. Поэтому мы используем этот aferUpdateElement, чтобы превратить наше скрытое поле в TRUE.
  3. Если пользователь изменяет значение поля поиска, для совершенно нового значения не выбрано, afterUpdateElement не используется, и наше скрытое значение по-прежнему установлено в TRUE. Решением этой проблемы является прослушивание нажатой клавиши. Если клавиша нажата, то скрытое поле снова становится ЛОЖНЫМ. Это работает для всех клавиш, даже клавиши Enter, фактически используемой для выбора. Так что это исключение, которое мы должны удалить из нашего слушателя нажатия клавиш. Итак, наконец, давайте посмотрим на нашу дополнительную функцию:

    $ (id-of-text-field) .observe ("keyup", function (e) {

    if (window.event) keycode = window.event.keyCode;
    иначе, если (e) код ключа = e.which;
    if (keycode! = 13) {

    $ (Ид из-скрытого поля) .value = "FALSE";

    }

    } bindAsEventListener ($ (Ид из-текста поля))).

Затем мы можем использовать скрытое поле, чтобы узнать, следует ли редактировать или создавать текстовое значение ...

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

...