2009-03-18 10 views
3

Je travaille avec l'ajax-autocompleter qui fonctionne très bien. Mon but est de rediriger entre une fonction d'édition pour un élément existant, ou une fonction de création pour un élément non trouvé.scriptaculous ajax autocomplete réponse vide

J'insère un identifiant spécifique à chaque li, et je peux donc l'utiliser pour la fonction d'édition avec une option afterUpdateElement.

Mais si aucun résultat n'est trouvé, la liste est vide et je ne trouve aucun moyen de dire au script afterUpdateElement qu'aucun résultat n'a été trouvé. En effet, aucune afterUpdateElement n'est appelée, car il n'y a pas de sélection. Donc, afterUpdateElement est inutile ...

Je pensais tester la valeur complète envoyée par la requête ajax. Mais je ne trouve pas comment le saisir ...

Répondre

1

Alors, j'ai finalement trouvé un moyen de vérifier si les résultats ont été sélectionnés ou non (avec l'aide énorme de Gwyohm):

  1. tout d'abord, nous mettons en place un champ caché qui enregistrera si un résultat a été sélectionné (vrai/faux). Par défaut, il est défini sur FALSE.
  2. L'attribut afterUpdateElement est uniquement utilisé après une sélection. Nous utilisons donc aferUpdateElement pour transformer notre champ caché en VRAI.
  3. Si l'utilisateur modifie la valeur du champ de recherche, pour une toute nouvelle valeur non sélectionnée, aucun afterUpdateElement n'est utilisé et notre valeur masquée est toujours définie sur TRUE. La solution à ce problème consiste à écouter une touche enfoncée. Si une touche est pressée, le champ caché revient à FALSE. Cela fonctionne pour toutes les clés, même la touche Entrée réellement utilisée pour faire une sélection. C'est donc une exception que nous devrions supprimer de notre écouteur keypress. Alors, enfin nous allons jeter un coup d'oeil à notre fonction supplémentaire:

    $ (id-de-champ de texte) .Respecter ("keyup", function (e) {

    si (fenêtre .event) = keycode window.event.keyCode;
    else if (e) = keycode e.which;
    si (keycode = 13) {

    $ (id-de-champ caché)! .value = "FALSE";

    }

    } .bindAsEventListener ($ (-champ id-de-texte)));

On peut alors utiliser le champ caché pour savoir si la valeur de texte doit être modifié ou créé ...

Prenez garde: avec cette solution, si les types d'utilisateurs d'une valeur correspondant à une valeur existante Sans le sélectionner, il sera considéré comme une nouvelle valeur et conduira à une entrée dupliquée si vous ajoutez cette valeur à votre base de données. (mais c'était correct pour moi, car je travaillais avec des noms, et deux personnes différentes peuvent avoir le même nom ...)

1

Vous pouvez essayer de remplacer la méthode updateChoices comme ceci:

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

Ce n'est pas un bon ideea pour écraser dans controls.js. Au lieu de cela, vous pouvez l'ajouter à un nouveau fichier .js et l'inclure après la bibliothèque.

EDIT: pff .. désolé pour les mauvais retraits, mais il est copié/collé à partir de TextMate et a des onglets combinés avec des espaces. J'espère que vous avez compris le point. La seule chose que j'ai ajouté était le

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

bloquer. En outre, je n'ai pas testé le code, mais je pense que cela devrait fonctionner.

+0

Merci pour votre réponse. Enfin, il semble que nous avons répondu en même temps! Votre solution semble être plus propre que la mienne; Je vais vérifier pour voir comment je peux y faire face. Merci;) – Yako

Questions connexes