MarkMatch 上的 Select2 toUpperCase 错误

Posted

技术标签:

【中文标题】MarkMatch 上的 Select2 toUpperCase 错误【英文标题】:Select2 toUpperCase error on markMatch 【发布时间】:2014-01-07 07:01:12 【问题描述】:

所以我一直在使用 select2 进行非 ajax 查询,到目前为止它非常有用。但是,我想将下拉列表之一用于 ajax json 响应。在整个整体文档中,有一些关于如何使用它的花絮。

整体文档:http://ivaynberg.github.io/select2/

除了正在整理的代码示例,几乎没有任何 html 代码或 json 示例,我现在不知所措。

所以这是我得到的 json:

["ST_CD":"NY","ST_SHRT_NM":"New York","ST_CD":"NY","ST_SHRT_NM":"New York1"]

这很标准。我在文档中注意到您需要映射一个“id”和一个“text”才能使其工作。不知道为什么我不能直接接受它,但也几乎没有任何文档。

https://groups.google.com/forum/#!topic/select2/rDPFU0IWpE0

select2 的作者提到了这些关键事实:

您需要在选项中提供 id 功能,因为您的 id 键 是“id”而不是“id”。

您还需要提供 formatResult 和 formatSelection 选项 因为你没有“文本”键。

这里有同样问题的用户:https://github.com/ivaynberg/select2/issues/693 也表明这是准确的。

但是,这对我来说不起作用。

$(document).ready(function () 
    $("#e6").select2(
        id: function(e)  return e.ST_CD ,
        placeholder: "Search for a movie",
        minimumInputLength: 1,
        ajax: 
            url: "api/VendorLocation",
            dataType: 'json',
            data: function (term, page) 
                return ;
            ,
            results: function (data, page) 
                return  results: data ;
            ,
            formatResult: function (item)  return item.ST_SHRT_NM; ,
            formatSelection: function (item)  return item.ST_SHRT_NM; 
        
    );
);

在ajax函数的返回结果部分,数据对象被正确填充。它有我需要的数据(ST_CD 和 ST_SHRT_NM 有正确的值),当我继续时,那是我得到错误的时候。无论 formatResult 和 formatSelection 是否存在,都会出现相同的错误。

所以我调试到 Select2,这就是错误出现的地方:

$.fn.select2.defaults = 
    (...)
    formatResult: function (result, container, query, escapeMarkup) 
        var markup = [];
        markMatch(result.text, query.term, markup, escapeMarkup);
        return markup.join("");
    ,
    (...)

在这段代码中,结果对象被填充,但文本属性未定义。

我认为将我的 json 数据格式化以符合前端 html 控件的标准,或者进行任何类型的 json 解析是非常不合理的。如果有一种方法可以让 select2 允许我明确指定文本和 id 部分,那么我想看看它或者知道我做错了什么。

【问题讨论】:

只是一个猜测,但这可能是因为您用作id 的属性需要是唯一的吗?在示例 JSON 中,ST_CD 属性对于这两个值都设置为 "NY" 我不认为 Select2 应该能够关心这一点,否则如果在前端,我会看到大量低效的加载。我实际上正在研究解决方案。我正在使用微风js 来处理数据获取和查询,而不是每次击键都必须从服务器获取。我从一次 fetch 加载,然后在客户端过滤每个新的击键。 【参考方案1】:

我问这个问题已经有一段时间了,但在我问这个问题一周后我想出了一个解决方案。所以我决定现在回答这个问题.. 刚刚创建了一个 DTO,它映射到 EF 使用 linq 创建的实际实体:

所以在服务器端:

public class StateDTO

    public string id  get; set; 
    public string text  get; set; 

然后是在发回之前被命中的查询

//the context is generated from EF
public IQueryable<StateDTO> Get(string st_name)

    return (
        from state in this.context.States
        where state.ST_SHRT_NM.Contains(st_name)
        select new StateDTO()  id = state.ST_CD,
                               text = state.ST_SHRT_NM,
                             );

我得到以下结果: ["id":"NY","text":"New York","id":"NY","text":"New York1"]

自从我设置了 select2 配置后,它就可以工作了:

$(document).ready(function () 
    $("#e6").select2(
        placeholder: "Search for a movie",
        minimumInputLength: 1,
        ajax: 
            url: "api/States",
            dataType: 'json',
            data: function (term, page) 
                return ;
            ,
            results: function (data, page) 
                return  results: data ;
            
        
    );
);

【讨论】:

以上是关于MarkMatch 上的 Select2 toUpperCase 错误的主要内容,如果未能解决你的问题,请参考以下文章

APICloud开发者进阶之路|[ 模块教程 ] touping模块demo示例

手机上的select2键盘问题

占位符上的 Select2 字体真棒图标

创建一个按钮以删除 select2 上的选定值

如何隐藏select2上的溢出?

单击选项时,引导模式上的 Select2 消失?