由于您使用输入元素而不是选择元素支持 Select2,并且它允许多选,我相信您需要定义一个 initSelection 函数。
添加以下选项:
initSelection: function (element, callback) {
callback($.map(element.val().split(','), function (id) {
return { id: id, text: id };
}));
}
jsfiddle
注意:不要调用以下代码:
$(test).val(["test1","test2"]).trigger("change");
你可以这样称呼:
$(test).select2('val', ["test1","test2"], true);
当你在没有定义 initSelection 函数的情况下这样做时,你会得到以下错误:
错误:错误:如果未定义 initSelection(),则无法调用 val()
注意:我认为您的第一个(非 ajax)示例在没有定义 initSelection 函数的情况下工作的原因是因为它指定了 tags 选项。
更新:Select2 v4
使用 Select2 v4 时,您应该始终使用 <select> 元素支持 Select2 控件,而不是隐藏输入。
<select id="test" style="width: 300px;" multiple="multiple">
</select>
注意:您仍然可以在选项中指定multiple: true,但您也可以使用<select> 元素的multiple 属性。
您可以通过在 html 中包含选定选项或以编程方式将选定选项添加到 <select> 元素来设置默认值,之后您应该在元素上触发更改事件,以便更新其显示。
$test.append('<option value="initial1" selected="selected">initial1</option>');
$test.append('<option value="initial2" selected="selected">initial2</option>');
$test.trigger('change');
在这种情况下,不再需要(或允许)initSelection 函数。
jsfiddle
注意:Select2 确实有一个支持某些向后兼容性的“完整”版本。这也可能是一种选择。