【问题标题】:Materialize autocomplete ajax实现自动完成 ajax
【发布时间】:2018-04-23 09:39:11
【问题描述】:

我正在使用materialize autocomplete 插件来创建具有自动完成功能的多个标签输入。插件工作正常,但只能将数据作为预先定义的数组传递。如果数据是从 ajax 调用传递的,插件不会显示带有选项的下拉菜单,就好像没有结果一样。实际上有结果,它们被缓存(使用缓存选项)并且仅在重新输入搜索词组后显示为下拉列表。

总而言之,自动完成插件不会等待 ajax 完成其请求并传递数据,这就是为什么第一次尝试不显示下拉菜单的原因。 一旦通过 ajax 调用检索到这些建议,有什么方法可以让这个插件在下拉列表中显示建议?

插件初始化:

autocomplete = $('#multipleInput').materialize_autocomplete({
        cacheable: true,
        throttling: true,
        multiple: {
            enable: true,
            maxSize : 5
        },
        appender: {
            el: '.ac-users'
        },
        dropdown: {
            el: '#multipleDropdown'
        },
        getData: function (value, callback) {

            callback(value,getAjaxDropdowValuesAutocomplete(value));
        }
});

从数据库中获取值的函数:

function getAjaxDropdowValuesAutocomplete(value){
        var returnArray = [],
        dataArray,
        innerObject = {},
        postParamsObj = {"search" : value};

        $.ajax({
            type: "POST",
            url: '/search-elements',
            data: postParamsObj,
            success: function( msg ) {
                dataArray = msg['data'];

                for(var i = 0;i < dataArray.length; i++){
                    innerObject = {};
                    innerObject["id"] = dataArray[i][0];
                    innerObject["text"] = dataArray[i][1] + " " + dataArray[i][2];
                    returnArray.push(innerObject);
                }

                // returnArray format [{ 'id': '1', 'text': 'Johnny Bravo' }]       

            },
            error : function(msg){
            }
        });

    return returnArray;
}

【问题讨论】:

    标签: javascript jquery autocomplete materialize


    【解决方案1】:

    您可以尝试在 ajax 请求的成功回调期间初始化自动完成功能,而不是相反。这样,您就可以确保在尝试开始绑定自动完成事件之前拥有数据。例如

    function getAjaxDropdowValuesAutocomplete(value) {
        var returnArray = [],
            dataArray,
            innerObject = {},
            postParamsObj = {"search": value};
    
        $.ajax({
            type: "POST",
            url: '/search-elements',
            data: postParamsObj,
            success: function (msg) {
                dataArray = msg['data'];
    
                for (var i = 0; i < dataArray.length; i++) {
                    innerObject = {};
                    innerObject["id"] = dataArray[i][0];
                    innerObject["text"] = dataArray[i][1] + " " + dataArray[i][2];
                    returnArray.push(innerObject);
                }
                // returnArray format [{ 'id': '1', 'text': 'Johnny Bravo' }] 
                autocomplete = $('#multipleInput').materialize_autocomplete({
                    cacheable: true,
                    throttling: true,
                    multiple: {
                        enable: true,
                        maxSize: 5
                    },
                    appender: {
                        el: '.ac-users'
                    },
                    dropdown: {
                        el: '#multipleDropdown'
                    },
                    getData: returnArray
                });      
    
            },
            error: function (msg) {
            }
        });
    
        return returnArray;
    }
    

    【讨论】:

    • 此解决方案可以正常工作,但效率低下,因为它会在每次发送数据请求时破坏和初始化插件。有一种方法 getData 旨在异步获取数据,但我一定做错了,因为它不等待请求完成
    • 我看到有一个节流选项:节流 [boolean]:是否对 getData 函数进行节流,默认值:true 不确定是否按预期工作
    • 你可能是对的,节流选项似乎不起作用,并且没有任何附加参数,例如节流量
    猜你喜欢
    • 2013-01-12
    • 2016-04-30
    • 2016-06-23
    • 1970-01-01
    • 2017-02-14
    • 1970-01-01
    • 2013-01-28
    • 2012-01-03
    • 2013-02-17
    相关资源
    最近更新 更多