如何通过Ajax请求使用JSON和Select2?

18 浏览
0 Comments

如何通过Ajax请求使用JSON和Select2?

我的Select2 3.4.5与JSON数据不兼容。这是我的HTML输入框:\n\n还有我的JavaScript代码:\n

$(".itemSearch").select2({
    placeholder: "搜索物品",
    minimumInputLength: 2,
    ajax: {
        url: "/api/productSearch",
        dataType: 'json',
        quietMillis: 100,
        data: function (term, page) {
            return {
                option: term
            };
        },
        results: function (data, page) {
            var more = (page * 10) < data.total;
            return {
                results: data.itemName,
                more: more
            };
        }
    },
    formatResult: function (data, term) {
        return data;
    },
    formatSelection: function (data) {
        return data;
    },
    dropdownCssClass: "bigdrop",
    escapeMarkup: function (m) {
        return m;
    }
});

\n我使用Laravel 4创建了一个API,在我的文本框中输入任何内容后,API会返回一个值。\n如果我在文本框中输入\"test\",这是返回的结果:\n[{\"itemName\":\"测试物品1号\",\"id\":5},\n{\"itemName\":\"测试物品2号\",\"id\":6},\n{\"itemName\":\"测试物品3号\",\"id\":7},\n{\"itemName\":\"测试物品4号\",\"id\":8},\n{\"itemName\":\"测试物品5号\",\"id\":9},\n{\"itemName\":\"测试物品6号\",\"id\":10},\n{\"itemName\":\"测试物品7号\",\"id\":11}]\n\n我无法将结果添加到Select2下拉菜单中。我认为formatSelectionformatResult可能是问题的原因,因为我不知道应该放置哪些参数。我不知道如何获取容器、对象和查询的参数以及它们应该返回的值,或者我的JSON响应是否有问题?

0
0 Comments

问题的原因是作者在使用Select2插件与JSON数据进行Ajax请求时,对于`data`参数的使用感到困惑。解决方法是将所需的数据以JSON格式返回,并在`processResults`方法中对返回的数据进行处理。

文章标题:如何通过Ajax请求使用Select2插件与JSON数据?

在使用Select2插件与JSON数据进行Ajax请求时,我们可以通过以下步骤来实现。

首先,在HTML中添加以下CDN链接:

<link href="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.10/css/select2.min.css" rel="stylesheet" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.10/js/select2.min.js"></script>

然后,在JavaScript中编写以下代码:

// 用于添加国家旗帜的函数
function formatState (state) {
    console.log(state);
    if (!state.id) {
      return state.text;
    }
    var baseUrl = "admin/images/flags";
    var $state = $(
      '<span><img src="'+baseUrl+ '/' + state.contryflage.toLowerCase() + '.png"  class="img-flag" /> ' +state.text+ '</span>'
    );
    return $state;
};
$(function(){
    $("#itemSearch").select2({
    minimumInputLength: 2,
    templateResult: formatState, // 用于添加国家旗帜
    ajax: {
        url: URL, // 替换为实际的URL
        dataType: 'json',
        type: "POST",
        data: function (term) {
            return {
                term: term
            };
        },
        processResults: function (data) {
            return {
                results: $.map(data, function (item) {
                    return {
                        text: item.name + ', ' + item.state.name + ', ' + item.state.coutry.name,
                        id: item.id,
                        contryflage: item.state.coutry.sortname
                    }
                })
            };
        }
    }
});

在上述代码中,`formatState`函数用于添加国家旗帜。我们在`templateResult`参数中指定该函数,以便在下拉列表中显示国家旗帜。

`ajax`参数用于配置Ajax请求。我们需要提供一个URL来获取数据,并将返回的数据进行处理。在`data`参数中,我们使用`term`作为关键词发送给服务器。在`processResults`方法中,我们对返回的数据进行处理,将其转换为Select2所需的格式。

最后,我们需要确保服务器返回的数据与我们期望的JSON响应一致。以下是一个示例JSON响应:

[

{

"id":7570,

"name":"Brussels",

"state":{

"name":"Brabant",

"coutry":{

"sortname":"BE",

"name":"Belgium",

}

}

},

{

"id":7575,

"name":"Brussels",

"state":{

"name":"Brabant Wallon",

"coutry":{

"sortname":"BE",

"name":"Belgium",

}

}

},

{

"id":7578,

"name":"Brussel",

"state":{

"name":"Brussel",

"coutry":{

"sortname":"BE",

"name":"Belgium",

}

}

},

]

在以上代码中,每个对象表示一个选项,包含id、name、state和country属性。

通过按照以上步骤,您可以使用Select2插件与JSON数据进行Ajax请求,并以所需的格式显示数据。

0
0 Comments

问题的出现原因:在使用Select2插件通过Ajax请求获取JSON数据时,可能会出现以下问题:

1. 无法解析返回的JSON数据;

2. 如果页面上包含多个选择框,只有最后一个选择框能够正常加载。

解决方法:

1. 确保在初始化Select2时,正确配置ajax属性中的url、dataType、type和data参数,以便正确发送Ajax请求并接收返回的JSON数据;

2. 在ajax属性中的results函数中,通过$.map方法将返回的JSON数据映射为Select2所需的格式,并返回给results属性;

3. 如果服务器返回的JSON数据为空,会导致Cannot read property 'length' of null错误。可以添加逻辑判断,如果data为空,则返回一个空数组;

4. 如果页面上包含多个选择框,只有最后一个选择框能够正常加载,这是因为id选择器(#profiles-thread)是唯一的,应该使用其他选择器,如CSS类选择器。

以下是使用Select2和通过Ajax请求获取JSON数据的示例代码:

$("#profiles-thread").select2({
    minimumInputLength: 2,
    tags: [],
    ajax: {
        url: URL,
        dataType: 'json',
        type: "GET",
        quietMillis: 50,
        data: function (term) {
            return {
                term: term
            };
        },
        results: function (data) {
            if (data) {
                return {
                    results: $.map(data, function (item) {
                        return {
                            text: item.completeName,
                            slug: item.slug,
                            id: item.id
                        }
                    })
                };
            } else {
                return { results: [] };
            }
        }
    }
});

以上就是使用Select2插件通过Ajax请求获取JSON数据的问题原因和解决方法。通过正确配置和处理返回的JSON数据,可以实现在选择框中使用Select2插件,并通过Ajax请求动态加载数据。同时,通过避免使用重复的id选择器,可以确保多个选择框能够正常加载。

0
0 Comments

问题的原因是没有正确地映射到"id"和"text"键值。解决方法是将映射正确地配置到"id"和"text"键值。

0