scriptaculous автозаполнение ajax пустой ответ

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

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

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

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


person Yako    schedule 18.03.2009    source источник


Ответы (2)


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

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

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

    if (window.event) keycode = window.event.keyCode;
    else if (e) keycode = e.what;
    if (keycode!=13) {

    $(идентификатор скрытого поля).value="FALSE";

    }

    }.bindAsEventListener($(id-текстового-поля)));

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

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

person Yako    schedule 19.03.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();
         }
      }
   }
}

Не рекомендуется перезаписывать в control.js. Вместо этого вы можете добавить это в новый .js и включить его после библиотеки.

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

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

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

person andi    schedule 19.03.2009
comment
Спасибо за ваш ответ. Наконец, кажется, мы ответили одновременно! Ваше решение кажется чище моего; Я собираюсь проверить это, чтобы увидеть, как я могу справиться с этим. Спасибо ;) - person Yako; 19.03.2009