select2 4.0 AJAX 预填 howto?
select2 4.0 AJAX pre-fill howto?
我已经读过 this, this, this and according to the documentation ,但其中 none 对我有用。
我正在尝试使用 AJAX select2。我正在尝试制作一个通用的 "select" 项目。
所以对于所有具有 data-select2-json
属性的元素,我应用 select2
和 data-select2-json
值中的 ajax URL .
$('[data-select2-json!=""][data-select2-json]').each(function() {
var url = $(this).attr('data-select2-json');
var pg_size = $(this).attr('data-select2-page-size') | 30;
$(this).select2({
language: language_code,
tokenSeparators: [',', ' '],
ajax: {
url: url,
dataType: 'json',
delay: 300,
data: function (params) {
return {
q: params.term, // -> q=[search term]
page: params.page // -> page=[no page]
};
},
processResults: function (data, params) {
params.page = params.page || 1;
console.log(data.items);
return {
results: data.items,
pagination: {
more: (params.page * pg_size) < data.total
}
};
},
cache: true
},
// let our custom formatter work
escapeMarkup: function (markup) { return markup; },
minimumInputLength: 1,
templateResult: formatRepo,
templateSelection: formatRepoSelection
});
});
效果不错!
JSON 服务器发送的格式总是这样:
{"items":
[{"item": "Fran\u00e7ais", "id": 1},
{"item": "Finlandais", "id": 5},
{"item": "Chinois simplifi\u00e9", "id": 15}
],
"total": 3}
它非常接近 AJAX 样本你 can find in the documentation。我的问题是 AJAX 初始化:我想在 HTML:
中添加值
<select multiple="multiple" class="form-control"
data-select2-json="/fr/chez-moi/tags/langues"
multiple="multiple"
name="known_languages">
<option value="1" selected="selected">Français</option>
<option value="2" selected="selected">Chinois simplifié</option>
</select>
然后用 select2 初始化(= 上面的代码 $(this).select2({..
)但是这不起作用并且给我空白值:
注意: 也不起作用,结果完全相同。
另一种解决方案是在 AJAX 中向 URL 询问带有类似“&init=1
”(或类似的参数)的参数,这样服务器将发送带有附加参数的结果像每个值的 checked: true
,我将用这些值调用 select2
。
文档中没有明确说明如何预填充 select2
。我该怎么办?
这是我的其他功能:
function item_or_text(obj) {
if (typeof(obj.item)!='undefined') {
return (obj.item.length ? obj.item : obj.text);
}
return obj.text;
}
function formatRepo(data) {
if (data.loading) return data.text;
var markup = item_or_text(data);
console.log('formatRepo', data, markup);
return markup;
}
function formatRepoSelection(item) {
var retour = item_or_text(item);
console.log('formatRepoSelection', item, item.item, retour);
return retour;
}
我创建了一个 working example on jsfiddle using the example code provided on the Select2 Examples 页面。我只需要更改他们的示例 select 标签以接受像您这样的多个标签:
<select multiple="multiple" ...
我还添加了第二个默认 selected 选项:
<option value="3620194" selected="selected">select2/select2</option>
<option value="317757" selected="selected">Modernizr/Modernizr</option>
如果您查看 fiddle,您会发现它按照您希望的方式工作。
您没有包含 templateSelection: formatRepoSelection
方法的代码。我的猜测是该方法是导致您出现问题的原因。示例页面上使用的代码是:
function formatRepoSelection(repo) {
return repo.full_name || repo.text;
}
虽然我不知道你的formatRepoSelection
代码是什么,但我想如果你把它改成类似下面的代码,你的问题就会得到解决:
function formatRepoSelection(repo) {
return repo.item;
}
我是这样解决的:
在 select 元素上执行 select2() 之前,获取它的初始值:
var initval = selector.attr("value");
将其转换为 select2 后,使用 initval 创建一个选项:
if (initval) {
var option = new Option(initval, initval, true, true);
selector.append(option).trigger('change');
}
您可以对多值 select 元素执行类似的操作。
我已经读过 this, this, this and according to the documentation
所以对于所有具有 data-select2-json
属性的元素,我应用 select2
和 data-select2-json
值中的 ajax URL .
$('[data-select2-json!=""][data-select2-json]').each(function() {
var url = $(this).attr('data-select2-json');
var pg_size = $(this).attr('data-select2-page-size') | 30;
$(this).select2({
language: language_code,
tokenSeparators: [',', ' '],
ajax: {
url: url,
dataType: 'json',
delay: 300,
data: function (params) {
return {
q: params.term, // -> q=[search term]
page: params.page // -> page=[no page]
};
},
processResults: function (data, params) {
params.page = params.page || 1;
console.log(data.items);
return {
results: data.items,
pagination: {
more: (params.page * pg_size) < data.total
}
};
},
cache: true
},
// let our custom formatter work
escapeMarkup: function (markup) { return markup; },
minimumInputLength: 1,
templateResult: formatRepo,
templateSelection: formatRepoSelection
});
});
效果不错!
JSON 服务器发送的格式总是这样:
{"items":
[{"item": "Fran\u00e7ais", "id": 1},
{"item": "Finlandais", "id": 5},
{"item": "Chinois simplifi\u00e9", "id": 15}
],
"total": 3}
它非常接近 AJAX 样本你 can find in the documentation。我的问题是 AJAX 初始化:我想在 HTML:
中添加值<select multiple="multiple" class="form-control"
data-select2-json="/fr/chez-moi/tags/langues"
multiple="multiple"
name="known_languages">
<option value="1" selected="selected">Français</option>
<option value="2" selected="selected">Chinois simplifié</option>
</select>
然后用 select2 初始化(= 上面的代码 $(this).select2({..
)但是这不起作用并且给我空白值:
注意:
另一种解决方案是在 AJAX 中向 URL 询问带有类似“&init=1
”(或类似的参数)的参数,这样服务器将发送带有附加参数的结果像每个值的 checked: true
,我将用这些值调用 select2
。
文档中没有明确说明如何预填充 select2
。我该怎么办?
这是我的其他功能:
function item_or_text(obj) {
if (typeof(obj.item)!='undefined') {
return (obj.item.length ? obj.item : obj.text);
}
return obj.text;
}
function formatRepo(data) {
if (data.loading) return data.text;
var markup = item_or_text(data);
console.log('formatRepo', data, markup);
return markup;
}
function formatRepoSelection(item) {
var retour = item_or_text(item);
console.log('formatRepoSelection', item, item.item, retour);
return retour;
}
我创建了一个 working example on jsfiddle using the example code provided on the Select2 Examples 页面。我只需要更改他们的示例 select 标签以接受像您这样的多个标签:
<select multiple="multiple" ...
我还添加了第二个默认 selected 选项:
<option value="3620194" selected="selected">select2/select2</option>
<option value="317757" selected="selected">Modernizr/Modernizr</option>
如果您查看 fiddle,您会发现它按照您希望的方式工作。
您没有包含 templateSelection: formatRepoSelection
方法的代码。我的猜测是该方法是导致您出现问题的原因。示例页面上使用的代码是:
function formatRepoSelection(repo) {
return repo.full_name || repo.text;
}
虽然我不知道你的formatRepoSelection
代码是什么,但我想如果你把它改成类似下面的代码,你的问题就会得到解决:
function formatRepoSelection(repo) {
return repo.item;
}
我是这样解决的: 在 select 元素上执行 select2() 之前,获取它的初始值:
var initval = selector.attr("value");
将其转换为 select2 后,使用 initval 创建一个选项:
if (initval) {
var option = new Option(initval, initval, true, true);
selector.append(option).trigger('change');
}
您可以对多值 select 元素执行类似的操作。