Domanda

Sto lavorando con l'ajax-autocompleter che funziona alla grande. Il mio obiettivo è il reindirizzamento tra una funzione di modifica per un elemento esistente o una funzione di creazione per un elemento non trovato.

Inserisco un ID specifico per ogni li e quindi posso usarlo per la funzione di modifica con un'opzione afterUpdateElement.

Ma se non viene trovato alcun risultato, l'elenco è vuoto e non riesco a trovare alcun modo per dire allo script afterUpdateElement che non sono stati trovati risultati. In effetti, non viene chiamato afterUpdateElement, poiché non esiste alcuna selezione. Quindi afterUpdateElement è inutile & # 8230;

Stavo pensando di testare l'intero valore inviato dalla richiesta Ajax. Ma non ho trovato come afferrarlo & # 8230;

È stato utile?

Soluzione

Quindi, ho finalmente trovato un modo per verificare se i risultati sono stati selezionati o meno (con l'enorme aiuto di Gwyohm):

  1. Innanzitutto, impostiamo un campo nascosto che registrerà se è stato selezionato un risultato (vero / falso). Per impostazione predefinita, è impostato su FALSE.
  2. afterUpdateElement viene utilizzato solo dopo una selezione. Quindi usiamo questo aferUpdateElement per trasformare il nostro campo nascosto in VERO.
  3. Se l'utente modifica il valore del campo di ricerca, per un valore nuovo di zecca non selezionato, non viene utilizzato afterUpdateElement e il nostro valore nascosto è ancora impostato su TRUE. La soluzione a questo problema è ascoltare un tasto premuto. Se viene premuto un tasto, il campo nascosto torna a FALSO. Funziona con tutti i tasti, anche il tasto Invio effettivamente utilizzato per effettuare una selezione. Quindi questa è un'eccezione che dovremmo rimuovere dal nostro listener di tasti. Quindi, diamo finalmente un'occhiata alla nostra funzione extra:

      

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

         
        

    if (window.event) keycode = window.event.keyCode;
        altrimenti if (e) keycode = e.which;
        if (keycode! = 13) {

             
          

    $ (id-di-nascosto-campo) .value = " FALSO " ;;

        
             

    }

      
         

    } bindAsEventListener ($ (id-of-text-field)));.

Possiamo quindi utilizzare il campo nascosto per sapere se il valore del testo deve essere modificato o creato ...

Attenzione: con questa soluzione, se l'utente digita un valore corrispondente a un valore esistente, senza selezionarlo, verrà considerato come un nuovo valore e porterà a una voce duplicata se si aggiunge questo valore al database. (ma questo andava bene per me, dato che stavo lavorando con i nomi e due persone diverse potrebbero avere lo stesso nome ...)

Altri suggerimenti

Puoi provare a sovrascrivere il metodo updateChoices in questo modo:

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();
         }
      }
   }
}

Non è una buona idea sovrascrivere in controls.js. Invece puoi aggiungerlo a un nuovo .js e includerlo dopo la libreria.

EDIT: pff .. mi dispiace per i rientri errati, ma è copia / incolla da TextMate e ha schede combinate con spazi. Spero che tu capisca il punto. L'unica cosa che ho aggiunto è stata

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

blocco. Inoltre, non ho testato il codice, ma penso che dovrebbe funzionare.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top