scriptaculous ajax completa automaticamente la risposta vuota
-
19-08-2019 - |
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;
Soluzione
Quindi, ho finalmente trovato un modo per verificare se i risultati sono stati selezionati o meno (con l'enorme aiuto di Gwyohm):
- Innanzitutto, impostiamo un campo nascosto che registrerà se è stato selezionato un risultato (vero / falso). Per impostazione predefinita, è impostato su FALSE.
- afterUpdateElement viene utilizzato solo dopo una selezione. Quindi usiamo questo aferUpdateElement per trasformare il nostro campo nascosto in VERO.
-
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.