将 select2 ajax 结果显示到模板中

Display select2 ajax results into template

提问人:user351479 提问时间:10/26/2023 最后编辑:Philuser351479 更新时间:10/26/2023 访问量:42

问:

我有 select2 在进行 ajax 调用后显示数据。

 <script>
    $(document).ready(function () {
        $("#citySelect").select2({
            theme: 'bootstrap-5',
            placeholder: "Search for your city",
            dropdownAutoWidth: true,
            width: 'auto',
            minimumInputLength: 3,
            allowClear: true,
            async: true,
            ajax: {
                url:
                    function (params) {
                        return '@GatewaySettings.Value.Url' + '/api/location/cities/' + params.term;
                    },
                contentType: "application/json; charset=utf-8",
                type: 'GET',
                processResults: function (result) {
                    return {
                        results: $.map(result, function (item) {
                            return { id: item.id, text: item.city };
                        }),
                    };
                }
            }
        });
    });
</script>

我可以搜索城市列表

我希望活动搜索结果显示为城市 + '、' + 州 + ' ' + zip(即加利福尼亚州洛杉矶 90001),选择后仅显示城市(即洛杉矶)。

我正在尝试遵循文档,但我不断得到一个未定义的结果。

enter image description here

下面是控制台的输出enter image description here

我敢肯定我只是不明白如何使用模板

  <script>
    $(document).ready(function () {
        $("#citySelect").select2({
            theme: 'bootstrap-5',
            placeholder: "Search for your city",
            dropdownAutoWidth: true,
            width: 'auto',
            minimumInputLength: 3,
            allowClear: true,
            async: true,
            templateResult: function (item) {
                console.log(item);
                return item.city + ', ' + item.state + ' ' + item.zip;
            },
            templateSelection: function (item) {
                return item.city
            },
            ajax: {
                url:
                    function (params) {
                        return '@GatewaySettings.Value.Url' + '/api/location/cities/' + params.term;
                    },
                contentType: "application/json; charset=utf-8",
                type: 'GET',
                cache: true,
                processResults: function (result) {
                    return {
                        results: $.map(result, function (item) {
                            return { id: item.id, text: item.city };
                        }),
                    };
                }
            }
        });
    });
</script>

任何帮助不胜感激

添加后控制台的结果

console.log("RESULTS", JSON.stringify(result, null, 2));

RESULTS [
  {
    "id": 5039,
    "city": "Chandlers Valley",
    "state": "Pennsylvania",
    "zip": null
  },
  {
    "id": 14327,
    "city": "Chandlersville",
    "state": "Ohio",
    "zip": null
  },
  {
    "id": 15915,
    "city": "Chandler",
    "state": "Indiana",
    "zip": null
  },
  {
    "id": 19293,
    "city": "Chandler",
    "state": "Minnesota",
    "zip": null
  },
  {
    "id": 22001,
    "city": "Chandlerville",
    "state": "Illinois",
    "zip": null
  },
  {
    "id": 26294,
    "city": "Chandler",
    "state": "Oklahoma",
    "zip": null
  },
  {
    "id": 26686,
    "city": "Chandler",
    "state": "Texas",
    "zip": null
  },
  {
    "id": 29715,
    "city": "Chandler",
    "state": "Arizona",
    "zip": null
  },
  {
    "id": 29716,
    "city": "Chandler",
    "state": "Arizona",
    "zip": null
  },
  {
    "id": 29717,
    "city": "Chandler",
    "state": "Arizona",
    "zip": null
  }
]
jquery ajax jquery-select2-4

评论

0赞 Phil 10/26/2023
究竟什么是“未定义的错误”?请编辑您的问题,以完整包含实际的错误消息
0赞 user351479 10/26/2023
我用 chrom 开发工具中的错误更新了问题
0赞 Phil 10/26/2023
干杯。那你为什么要改变你的?原版直接使用 作为数组,但您的新版本使用 ,那么哪个是正确的?processResultsdatadata.items
0赞 user351479 10/26/2023
我认为通过在“processResults”中设置id和text值,我使其他元素对模板函数不可用,这就是我尝试返回项目所有属性的原因。我看到我的假设是不正确的。我更新了processResults函数,并使用屏幕截图中新的未定义错误更新了问题
0赞 user351479 10/26/2023
对不起,它迟到了,我有点累了。我已经从问题中删除了错误。我已经使用控制台的输出更新了问题

答:

1赞 Phil 10/26/2023 #1

你的在很大程度上是多余的,也排除了你似乎想要使用的属性。$.map()

您真正需要做的就是将数组嵌套在一个属性下,以便 Select2 可以使用它。results

templateResult: ({ city, state, zip }) =>
  `${city}, ${state} ${zip ?? ""}`.trim(),
templateSelection: ({ city }) => city,
ajax: {
  url: ({ term }) =>
    "@GatewaySettings.Value.Url" +
    `/api/location/cities/${encodeURIComponent(term)}`, // encode the term
  processResults: (results) => ({ results }),
}

关于属性的一些说明...ajax

  • 默认方法(类型)为GET
  • 默认属性为cachetrue
  • GET 请求没有内容,因此不需要contentType

评论

1赞 user351479 10/26/2023
做到了。非常感谢。我将我的一个查询从 dapper 更改为别名 ZipCode 再到 Zip,现在它可以工作了!我明天会回顾你所做的事情,以便我能够继续学习