69 votes

Ce n'est saisie semi-automatique de requête/réponse du serveur?

Ce qui semble être un trou noir: Après une heure de recherche, le jQuery UI site web, de Débordement de Pile, et une recherche sur google, je n'ai pas encore trouver la plupart des informations de base de la façon d'écrire le côté serveur de la saisie semi-automatique.

Ce paramètre est transmis au serveur et quelle devrait être la réponse JSON?

Je dois manquer quelque chose, car de la façon dont tout le monde apprendre comment faire cela? Les Sites ne semblent discuter le code JavaScript côté client et de ne jamais le protocole ou côté serveur exemples.

J'ai besoin pour obtenir le plus simple à distance exemple de travail.

79voto

Andrew Whitaker Points 58588

Ce paramètre est transmis au serveur

Vous avez besoin de passer request.term de votre code côté serveur (à partir de la documentation):

Une demande d'objet, avec un seul propriété appelée "terme", qui se réfère à la valeur actuellement dans le texte d'entrée.

Pour l'essentiel, dans votre autocomplete code, vous aurez quelque chose comme ceci:

$("#autocomplete").autocomplete({
    // request.term needs to be passed up to the server.
    source: function(request, response) { ... }
});

et quelle devrait être la réponse JSON look comme?

L' autocomplete widget attend un tableau d'objets JSON avec label et value propriétés (bien que si vous venez de spécifier value, il sera utilisé comme étiquette). Ainsi, dans le cas le plus simple, il vous suffit de renvoyer des données qui ressemble à ceci:

[
    { label: 'C++', value: 'C++' }, 
    { label: 'Java', value: 'Java' }
    { label: 'COBOL', value: 'COBOL' }
]

Si vous avez besoin de quelque chose de plus compliqué, vous pouvez utiliser l' success argument de l' $.ajax fonction de normaliser les données que vous obtenez de retour avant la saisie semi-automatique obtient:

source: function( request, response ) {
    $.ajax({
        /* Snip */
        success: function(data) {
            response($.map( data.geonames, function( item ) {
                return {
                    label: item.name + (item.adminName1 ? ", " + item.adminName1 : "") + ", " + item.countryName,
                    value: item.name
                }
            }));
         }
    });

Ce code est pris à partir de l'exemple ici (C'est un bon exemple d'ensemble de l'ajax + de saisie semi-automatique fonctionne dans un scénario plus complexe).

Fondamentalement, ce qui se passe, c'est que sur un succès de la requête ajax, les données reçues est normalisée (à l'aide d' $.map) à ce que la saisie semi-automatique widget attend.

Espérons que cela aide.

28voto

James Boyden Points 184

En plus de Andrew Whitaker est la réponse parfaite, une méthode alternative à l' $.la carte est de remplacer le moteur de rendu, un exemple de ce qui est indiqué sur l'INTERFACE utilisateur de jQuery page de Démonstration.

J'ai utilisé cette fonctionnalité à l'aide d'un appel JSON comme suit:

Réponse JSON

{
   "Records": [
       {
           "WI_ID": "1",
           "Project": "ExampleProject",
           "Work_Item": "ExampleWorkItem",
           "Purchase_Order": "",
           "Price": "",
           "Comments": "",
           "Quoted_Hours": "",
           "Estimated_Hours": "",
           "Achieved": "False",
           "Used_Hours": "0"
       }
   ]
}

jQuery

$("#WorkItem").autocomplete({
      source: function(request, response){
           $.ajax({
               type: "POST",
               url: "ASPWebServiceURL.asmx/WorkItems",
               data: "{'Project_ID':'1'}",
               contentType: "application/json; charset=utf-8",
               dataType: "json",
               success: function (msg) {
                   response($.parseJSON(msg.d).Records);
               },
               error: function (msg) {
                   alert(msg.status + ' ' + msg.statusText);
               }
           })
       },

       select: function (event, ui) {
           $("#WorkItem").val(ui.item.Work_Item);
           return false;
       }
})
.data("autocomplete")._renderItem = function (ul, item) {
    return $("<li></li>")
    .data("item.autocomplete", item)
    .append("<a>" + item.Work_Item + "</a>")
    .appendTo(ul);
};

Dans cet exemple, le _renderItem fonction est remplacé, de sorte que la liste des résultats de recherche (j'.e, la liste qui s'affiche sous la zone de texte) est remplie à l'aide des attributs des documents que j'ai récupérée à partir de la réponse JSON.

Tandis que pas aussi simple, il vous permet de retirer certaines des choses assez intéressantes (à l'aide de plusieurs bits de données à partir d'une réponse JSON, par exemple)

7voto

Brian Ogden Points 1954

Les deux réponses sont complexes et trompeuse, une clé de compréhension de jQuery UI-Automatique est le succès fonction anonyme, vous avez l'effet de levier/contrôle du format de votre côté serveur réponse JSON en raison du succès de rappel de la saisie semi-automatique. L'étiquette,format de valeur est bonne à suivre, mais vous pouvez définir n'importe quel format JSON, vous avez le désir, la clé est de savoir comment vous définissez votre réussite fonction:

 <input id="refPaymentTerms" class="form-control">

$("#refPaymentTerms").autocomplete({
                source: function (request, response) {
                    $.ajax({
                        type: "POST",
                        url: "/admin/JobPaymentRefs",
                        dataType: "json",
                        data: {
                            term: request.termCode
                        },
                        error: function (xhr, textStatus, errorThrown) {
                            alert('Error: ' + xhr.responseText);
                        },
                        success: function (data) {
                            response($.map(data, function (item) {
                                return {
                                    label: item.label,
                                    value: item.value
                                }
                            }));
                        }
                    });
                }
            });

MVC Contrôleur:

public JsonResult JobPaymentRefs()
    {
        var query = from REFTerm in _db.REFTerms
                     select new
                    {
                        label = REFTerm.TermCode,
                        value = REFTerm.TermCode
                    };
        //var refTerms = _db.REFTerms.Select(x => x.TermCode);

        return Json(query.ToArray());
    }

Ici, nous voyons une très standard automatique lier avec un ASP.NET backend.

Vous pouvez retourner tout format JSON que vous désirez côté serveur aussi longtemps que vous le mapper correctement dans la saisie semi-automatique anonyme de rappel. L'étiquette,le nom de la valeur de la valeur de la paire qui est assez bon pour la plupart des besoins, mais le faire comme vous allez côté serveur avec votre JSON juste la carte correctement dans la saisie semi-automatique succès de rappel.

3voto

Salman A Points 60620

Vous êtes pas tenu de modifier le serveur de script côté afin d'utiliser jQuery UI autocomplete. Vous pouvez spécifier une fonction JavaScript que l' source pour créer des requêtes (par exemple l'utilisation des POST ou GET, utiliser les paramètres de chaîne de requête que le serever côté script attend) et la poignée arbitraire des réponses (par exemple poignée de réponse XML).

Cela dit, lorsque vous utilisez une chaîne de caractères comme l' source paramètre, puis:

[...] la saisie semi-automatique du plugin s'attend à ce que la chaîne de pointer vers une URL ressource qui sera de retour de données JSON. Il peut être sur le même hôte ou sur un autre (JSONP). La saisie semi-automatique plugin ne fonctionne pas filtrer les résultats, au lieu d'une chaîne de requête est ajoutée avec un termede champ, qui du côté serveur, le script doit utiliser pour filtrer les résultats. Pour exemple, si la source de l'option est définie à l' http://example.com et le types d'utilisateur toto, une demande devra être faite à http://example.com?term=foo. Les données peuvent être dans le même format que les données décrites ci-dessus.

Concernant "Les données ne peuvent être dans le même format que les données décrites ci-dessus", la suite de JSON (ou JSONP), les formats de travail:

// no matching entries
[]

// array of strings
[
"Option 1",
"Option 2"
]

// array of objects with label property
[{
    "label": "Option 1"
}, {
    "label": "Option 2"
}]

// array of objects with value property
[{
    "value": "Option 1"
}, {
    "value": "Option 2"
}]

// array of objects with label and value properties
[{
    "label": "Option 1",
    "value": 1
}, {
    "label": "Option 2",
    "value": 2
}]

Pour les tableaux d'objets, vous pouvez spécifier des propriétés supplémentaires en plus de l'étiquette et/ou value. Toutes les propriétés seront disponibles à l'intérieur de rappels.

0voto

Hari Agarwal Points 1
<!doctype html>

<html lang="en">
    <head>
        <meta charset="utf-8" />
        <title>jQuery UI Autocomplete - Categories</title>
        <link rel="stylesheet" href="http://code.jquery.com/ui/1.10.3/themes/smoothness/jquery-ui.css" />
        <script src="http://code.jquery.com/jquery-1.9.1.js"></script>
        <script src="http://code.jquery.com/ui/1.10.3/jquery-ui.js"></script>
        <link rel="stylesheet" href="http://stackoverflow.com/resources/demos/style.css" />
        <style>
            .ui-autocomplete-category {
                font-weight: bold;
                padding: .2em .4em;
                margin: .8em 0 .2em;
                line-height: 1.5;
            }
            body {
                font-family: "Trebuchet MS", "Helvetica", "Arial", "Verdana", "sans-serif";
                font-size: 62.5%;
            }
        </style>
        <script>
            $.widget("custom.catcomplete", $.ui.autocomplete, {
                _renderMenu : function(ul, items) {
                    var that = this, currentCategory = "";
                    $.each(items, function(index, item) {
                        if (item.category != currentCategory) {
                            ul.append("<li class='ui-autocomplete-category'>" + item.category + "</li>");
                            currentCategory = item.category;
                        }
                        that._renderItemData(ul, item);
                    });
                }
            });
        </script>
        <script>
            $(function() {
                $("#search").catcomplete({
                    delay : 0,
                    source : function(request, response) {
                        $.ajax({
                            url : "search",
                            dataType : "json",
                            data :"searchText=hk",
                            success : function(data) {
                                response(data);
                            } //success
                        });
                    }
                });
            });
        </script>
    </head>
    <body>enter code here
        <label for="search">Search: </label>
        <input id="search" />
    </body>
</html>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X