select2和远程数据:预设值和文本,避免服务器往返

Lef*_*tyX 5 asp.net-mvc jquery jquery-select2

我正在生成我的HTML标签服务器端(asp.net mvc4).
我想预先设置我的HIDDEN字段的值和描述,避免使用ajax调用来获取initSelection函数中的数据.

我见过有人用javascript设置值:

$("#select2Test").select2('data', { id: 20832, text: 'LONDON' })
Run Code Online (Sandbox Code Playgroud)

但它仍然需要我额外的代码来实现已经从viewmodel中的服务器流式传输的东西.

我想出了这样的事情:

<input type="hidden" id="select2Test" name="select2Test" value="20832" data-option="LONDON" />
Run Code Online (Sandbox Code Playgroud)

我已经使用HTML5数据属性data-option和我的查找描述,并且我已经实现了initSelection函数,以便我可以读取my字段的值及其数据属性:

initSelection: function (item, callback) {
   var id = item.val();
   var text = item.data('option');
   var data = { id: id, text: text };
   callback(data);
},
Run Code Online (Sandbox Code Playgroud)

我已经看到只有在隐藏字段设置了值时才会调用initSelection.
一切似乎都正常.

还有更好的选择吗?

Lef*_*tyX 14

data-option结合习惯initSelection做了伎俩.

    $("#lookup_id").select2({
        minimumInputLength: 3,
        multiple: false,
        allowClear: true,
        ajax: {
            url: urlFetchCity,
            dataType: 'json',
            type: "POST",
            data: function (term, page) { return { city: term }; },
            results: function (data, page) {
                return {
                    return {results: data};
                };
            }
        },
        initSelection: function (item, callback) {
            var id = item.val();
            var text = item.data('option');
            var data = { id: id, text: text };
            callback(data);
        },
        formatResult: function (item) { return ('<div>' + item.id + ' - ' + item.text + '</div>'); },
        formatSelection: function (item) { return (item.text); },
        escapeMarkup: function (m) { return m; }
    });
Run Code Online (Sandbox Code Playgroud)

对于那些感兴趣的人我已经创建了一个GitHub存储库,您可以在其中找到一个ASP.NET MVC4项目,其中我添加了一个html帮助程序来创建一个具有客户端验证所有功能的select2标记.