【问题标题】:JQuery autocomplete source from another js function来自另一个 js 函数的 JQuery 自动完成源
【发布时间】:2014-08-26 21:59:57
【问题描述】:

我有一个 Jquery 自动完成函数,它的源是从另一个基于 request.term 的函数计算出来的,所以我不知道如何设置源属性。

自动完成:

$( "#finder_city" ).autocomplete({
    source: function(request){
        var searchParam  = request.term;
        init(searchParam);
    },
    minLength: 2,
});

我的功能:

function init(query) {
//lot of code 
return response;

}

我的函数返回有效数据,例如response = [ city1, city2, city3 ];,但自动完成只是启动“加载器图标”,没有任何反应,日志中没有错误。

谁能说说如何从另一个 js 函数中设置源代码?

【问题讨论】:

    标签: jquery jquery-ui autocomplete


    【解决方案1】:

    source 函数有两个参数,请求和回调,一旦响应返回,您需要调用回调

    $( document ).ready(function() {
    
        $( "#finder_city" ).autocomplete({
            source: function(request, callback){
                var searchParam  = request.term;
                init(searchParam, callback)
            },
            minLength: 2
        });
    });
    
    function init(query, callback) {
        ymaps.geocode(query, { results: 5 }).then(function (res) {
    
            var response = [];
            if (res.geoObjects.get(0) == null) {
    
            }
            else if (res.geoObjects.get(1) == null){
                response = [
                    res.geoObjects.get(0).properties.get('text')
                ];
            }
            else if (res.geoObjects.get(2) == null){
                response = [
                    res.geoObjects.get(0).properties.get('text'),
                    res.geoObjects.get(1).properties.get('text')
                ];
            }
            else if (res.geoObjects.get(3) == null){
                response = [
                    res.geoObjects.get(0).properties.get('text'),
                    res.geoObjects.get(1).properties.get('text'),
                    res.geoObjects.get(2).properties.get('text')
                ];
            }
            else if (res.geoObjects.get(4) == null){
                response = [
                    res.geoObjects.get(0).properties.get('text'),
                    res.geoObjects.get(1).properties.get('text'),
                    res.geoObjects.get(2).properties.get('text'),
                    res.geoObjects.get(3).properties.get('text')
                ];
            }
            else {
                response = [
                    res.geoObjects.get(0).properties.get('text'),
                    res.geoObjects.get(1).properties.get('text'),
                    res.geoObjects.get(2).properties.get('text'),
                    res.geoObjects.get(3).properties.get('text'),
                    res.geoObjects.get(4).properties.get('text')
                ];
            }
            callback(response);
        });
    }
    

    演示:Fiddle

    【讨论】:

    • 嗨,现在我明白了。我在非异步函数上检查它,它没问题。但我的方法是异步的,它从 js api 加载数据。有异步方法的解决方案吗?
    • 你需要分享init方法
    • 我简化了一点,但这里是代码 - jsfiddle.net/lesnick/gxW8c 注意 html 中包含的 js,它的 js API 类似于 Google Maps API。尝试在字段中输入“纽约”,它将 console.log() 响应
    • 完美运行!非常感谢!因此,据我所知,回调必须在 init 函数中接收数据,但我不知道为什么。您能给我提供任何链接或搜索方向吗?
    • @lesnick 你可以看看如何处理异步响应......这是基于 ajax 的开发环境中的正常场景
    【解决方案2】:

    在你的匿名回调中,需要返回init(searchParam)的返回值。

    只是改变:

    init(searchParam);
    

    收件人:

    return init(searchParam);
    

    【讨论】:

      【解决方案3】:

      例子:

      source: function (request, response) { // Contains
          var searchString = request.term,
              array = [];
      
          // OPTIONS
          array.push('test 1');
          array.push('foo');
          array.push('var');
      
          response(array);
      }
      

      【讨论】:

        猜你喜欢
        • 2015-07-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-31
        相关资源
        最近更新 更多