Typeahead Wait发出多个请求而不是最后一个请求

时间:2013-09-24 22:20:59

标签: javascript jquery twitter-bootstrap bootstrap-typeahead typeahead

我正在使用bootstrap's typeahead从数据库中获取“姓氏”。我已经阅读了文档,我认为一切正常。然而,当我开始搜索时,我意识到“搜索”太慢了,我认为这是因为“typeahead”每次按下一个键都会发送请求。

如何在填写文本框后停止发送许多请求或尝试发送整个字符串?

也许这些信息可能会有所帮助

这是观点:

enter image description here

这是开发者工具的观点:

enter image description here

这是JS:

我使用回调来发送请求:

var familias = {};
var familiaLabels = [];  

//Callback for searching the string
var buscarFamilia = _.debounce(function( query, process ){

    $.getJSON( '{/literal}{$smarty.const.FAMILIARES_FE_ROOT}{literal}/ws/familia-ajax/', { q: query }, function ( data ) {

        //Clean containers
        familias = {};
        familiaLabels = [];

        //Using some underscore.js for getting data from each item 
        _.each( data, function( item, ix, list ){

            //Fill with the name of each item
            familiaLabels.push( item.nombre );

            //Fill data for the template
            familias[ item.nombre ] = {

              id:item.id,
              nombre:item.nombre,
              padre:item.padre,
              madre:item.madre

            };
        });

        //Return the array
        process( familiaLabels );
    },800);

}); 

这是“typeahead”的配置:

$('#alu_familia').typeahead({
    source: function ( query, process ) {

        buscarFamilia ( query, process )
    }
    , updater: function (itemSelected) {

        //This is for getting the id
        $( "#alu_fami_id" ).val( familias[ itemSelected].id );


        return itemSelected;
    }
    ,
    minLength:2,
    matcher: function () { return true; }
    ,highlighter: function(item){
        var p = familias[ item ];
        var itm = ''
                 + "<div class='typeahead_wrapper'>"
                 + "<div class='typeahead_labels'>"
                 + "<div class='typeahead_primary'>" + p.nombre + "</div>"
                 + "<div class='typeahead_secondary'><b>Padre: </b>" + p.padre +"</div>"
                 + "<div class='typeahead_secondary'><b>Madre: </b>"+p.madre+ "</div>"
                 + "</div>"
                 + "</div>";
        return itm;
    }
  });

提前致谢。

1 个答案:

答案 0 :(得分:0)

您可以通过将任何以前检索到的值存储在缓存对象中来避免对同一查询发出两个Ajax请求,如下所示:


    var familias = {};
    var familiaLabels = [];  
    var familiasCache = {};
    //Callback for searching the string
    var buscarFamilia = _.debounce(function( query, process ){

    if (typeof familiasCache[query] !== "undefined") {
        return process(familiasCache[query]);
    }

    $.getJSON( '{/literal}{$smarty.const.FAMILIARES_FE_ROOT}{literal}/ws/familia-ajax/', { q: query }, function ( data ) {

        //Clean containers
        familias = {};
        familiaLabels = [];

        //Using some underscore.js for getting data from each item 
        _.each( data, function( item, ix, list ){

            //Fill with the name of each item
            familiaLabels.push( item.nombre );

            //Fill data for the template
            familias[ item.nombre ] = {

              id:item.id,
              nombre:item.nombre,
              padre:item.padre,
              madre:item.madre

            };
        });

        // store result in cache
        familiasCache[query] = familiaLabels;

        //Return the array
        process( familiaLabels );
    },800);